java调用需要登录的https restful接口

sq287197314 2018-01-04 05:18:24
最近公司让做个数据同步,给了两个restful获取账户信息的接口,但是需要登录才能获取数据,希望各位大佬能指点一下。
这是登录界面,https://id.xmu.edu.my/api-auth/login/?next=/api/malayteachers/

这是我调这个接口的代码,里面具体代码参考的是
http://blog.csdn.net/zpf336/article/details/73480810

public class HTTPSClientTest {
public static void main(String[] args) throws Exception {
HttpClient httpClient = null;

httpClient = new HTTPSTrustClient().init();
// httpClient = new HTTPSCertifiedClient().init();

String url = "https://id.xmu.edu.my/api-auth/login/";
// String url = "https://id.xmu.edu.my/api/malayteachers/";
// String url = "https://1.2.6.2:8011/xxx/api/getHealth";

Map<String, String> paramHeader = new HashMap<>();
paramHeader.put("Accept", "application/json");
Map<String, String> paramBody = new HashMap<>();
//paramBody.put("referrer", "https://id.xmu.edu.my/");
paramBody.put("csrfmiddlewaretoken", "kMTIfPRf7QdGFJ4km2NHmbnUdxM0Ta6TP2JJ6fa8hl1GcmyuJmJdI4dW55ymy5nV");
paramBody.put("next", "/api/malayteachers/");
paramBody.put("id_username", "xxxxxx");
paramBody.put("id_password", "xxxxxx");
String result = HTTPSClientUtil.doPost(httpClient, url, paramHeader, paramBody);

// String result = HTTPSClientUtil.doGet(httpsClient, url, null, null);

System.out.println(result);
}
}
...全文
1228 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36264496 2018-04-01
  • 打赏
  • 举报
回复
你好,我最近也遇到相似的问题,调用接口RestFul 接口会有一个用户名密码的验证,请问你这个解决了吗?
sq287197314 2018-01-27
  • 打赏
  • 举报
回复
把账号密码加密放在头里就行了

    private static void doPost() throws Exception {
		HttpClient httpClient = null;

		httpClient = new HTTPSTrustClient().init();
		// httpClient = new HTTPSCertifiedClient().init();

		
		String url = "https://xxxxxx/";
		String username = "";
		String password = "";
		// String url = "https://1.2.6.2:8011/xxx/api/getHealth";

		Map<String, String> paramHeader = new HashMap<>();
		paramHeader.put("Accept", "application/json");
		
		String authHeader = new sun.misc.BASE64Encoder().encode((username + ":" + password).getBytes());
		//System.out.println(authHeader);
		paramHeader.put("Authorization", "Basic " + authHeader);
		Map<String, String> paramBody = new HashMap<>();
		//paramBody.put("referrer", "https://id.xmu.edu.my/");
		//paramBody.put("csrfmiddlewaretoken", "QMBi9iuxCtI0GAREyUvZpVGD3BJdQnYk8U9VdooBwjyofJLksFay6XoEwkdW0nUt");
		//paramBody.put("next", "/api/malayteachers/");
		/*paramBody.put("username", username);
		paramBody.put("password", password);*/
		String result = HTTPSClientUtil.doGet(httpClient, url, paramHeader, paramBody);

		// String result = HTTPSClientUtil.doGet(httpsClient, url, null, null);

		System.out.println(result);
	}
ZHOU西口 2018-01-07
  • 打赏
  • 举报
回复
这个不是get请求吧,你需要用post模拟登陆,把header、cookie都带上。
maradona1984 2018-01-05
  • 打赏
  • 举报
回复
你用浏览器请求,看看浏览器如何保持会话的,一般场景(容器tomcat,用session来维持会话),可以看下JSESSIONID,如果是其他,那得看你们在cookie存的是什么,反正都是用HttpClient先登录,然后拿到cookie,再发送请求时把cookie带过去就OK了
sq287197314 2018-01-05
  • 打赏
  • 举报
回复
用浏览器登陆后有两个cookie,一个是csrftoken,还有一个是sessionid。 我先拿到cookie之后,再去登陆,但是还好报403错误。

ublic class LoginTest extends HttpClientBuilder {

	public static void main(String[] args) throws Exception {
		// 跳过证书验证
		SSLContext ctx = SSLContext.getInstance("TLS");
		X509TrustManager tm = new X509TrustManager() {
			@Override
			public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
			}
	
			@Override
			public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
			}
	
			@Override
			public X509Certificate[] getAcceptedIssuers() {
				return null;
			}
		};
		// 设置成已信任的证书
		ctx.init(null, new TrustManager[] { tm }, null);
		ConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(ctx);

		// 设置协议http和https对应的处理socket链接工厂的对象
		Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
				.<ConnectionSocketFactory> create()
				.register("http", PlainConnectionSocketFactory.INSTANCE)
				.register("https", connectionSocketFactory).build();
		PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
		HttpClients.custom().setConnectionManager(connManager);
		
		CookieStore cookieStore = new BasicCookieStore();
		HttpClients.custom().setDefaultCookieStore(cookieStore);
		
		// 全局请求设置
		RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
		// 创建HttpClient上下文
		HttpClientContext context = HttpClientContext.create();
		context.setCookieStore(cookieStore);

		// 创建一个HttpClient
		CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(globalConfig).setDefaultCookieStore(cookieStore).build();

		CloseableHttpResponse res = null;

		// 创建本地的HTTP内容
		try {
			try {
				// 创建一个get请求用来获取必要的Cookie,如_xsrf信息
				HttpGet get = new HttpGet("https://id.xmu.edu.my/api-auth/login");

				res = httpClient.execute(get, context);
				// 获取常用Cookie,包括_xsrf信息
				System.out.println("访问登陆页的获取的常规Cookie:===============");
				String token = null;
				for (Cookie c : cookieStore.getCookies()) {
					System.out.println(c.getName() + ": " + c.getValue());
					if ("csrftoken".endsWith(c.getName())) {
						token = c.getValue();
					}
				}
				res.close();

				// 构造post数据
				List<NameValuePair> valuePairs = new LinkedList<NameValuePair>();
				valuePairs.add(new BasicNameValuePair("csrfmiddlewaretoken", token));
				valuePairs.add(new BasicNameValuePair("next", "/api/malayteachers/"));
				valuePairs.add(new BasicNameValuePair("id_username", "id_username"));
				valuePairs.add(new BasicNameValuePair("id_password", "id_password"));
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(valuePairs, Consts.UTF_8);
				entity.setContentType("application/x-www-form-urlencoded");

				// 创建一个post请求
				HttpPost post = new HttpPost("https://id.xmu.edu.my/api-auth/login/?next=/api/malayteachers/");
				// 注入post数据
				post.setEntity(entity);
				res = httpClient.execute(post, context);

				res.close();

				System.out.println("登陆成功后,新的Cookie:===============");
				for (Cookie c : context.getCookieStore().getCookies()) {
					System.out.println(c.getName() + ": " + c.getValue());
				}

				// 构造一个新的get请求,用来测试登录是否成功
				HttpGet newGet = new HttpGet("https://id.xmu.edu.my/api/malayteachers/");
				res = httpClient.execute(newGet, context);
				String content = EntityUtils.toString(res.getEntity());
				System.out.println("登陆成功后访问的页面===============");
				System.out.println(content);
				res.close();

			} finally {
				httpClient.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
oyljerry 2018-01-04
  • 打赏
  • 举报
回复
只要就是看登录API返回的认证身份信息。然后后面的请求带上这个信息
rumlee 2018-01-04
  • 打赏
  • 举报
回复
首先登录拿到cookie,然后带上cookie去访问接口就好了。
课程简介这是一门使用Java语言,SpringBoot框架,从0开发一个RESTful API应用,接近企业级的项目(我的云音乐),课程包含了基础内容,高级内容,项目封装,项目重构等知识,99%代码为手写;因为这是项目课程;所以不会深入到源码讲解某个知识点,以及原理,但会粗略的讲解下基础原理;主要是讲解如何使用系统功能,流行的第三方框架,第三方服务,完成接近企业级项目,目的是让大家,学到真正的企业级项目开发技术。适用人群刚刚毕业的学生想提高职场竞争力想学从零开发SpringBoot项目想提升SpringBoot项目开发技术想学习SpringBoot项目架构技术想学习企业级项目开发技术就是想学习SpringBoot开发能学到什么从0开发一个类似企业级项目学会能做出市面上90%通用API快速增加1到2年实际开发经验刚毕业学完后能找到满意的工作已经工作学完后最高涨薪30%课程信息全课程目前是82章,155小时,每节视频都经过精心剪辑。在线学习分辨率最高1080P课程知识点1~11章:学习方法,项目架构,编码规范,Postman使用方法,Git和Github版本控制12~16章:搭建开发环境,快速入门SpringBoot框架17~20章:快速入门MySQL数据库21~30章:MyBatis,登录注册,找回密码,发送短信,发送邮件,企业级接口配置31~41章:实现歌单,歌单标签,音乐,列表分页,视频,评论,好友功能42~48章:阿里云OSS,话题,MyBatis-plus,应用监控49~53章:Redis使用,集成Redis,SpringCache,HTTP缓存54~58章:Elasticsearch使用,集成Elasticsearch,使用ES搜索59~61章:商城,集成支付宝SDK,支付宝支付62~64章:常用哈希和加密算法,接口加密和签名65~67章:实时挤掉用户,企业级项目测试环境,企业级接口文档68~69章:SpringBoot全站HTTPS,自签证书,申请免费证书70~73章:云MySQL数据库,云Redis数据库使用,轻量级应用部署环境,域名解析74~80章:Docker使用,生产级Kubernetes集群,域名解析,集群全站HTTPS81~82章:增强和重构项目,课程总结,后续学习计划

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧