调用别人接口如何跳过登陆
程序员文章站
2024-01-10 10:12:46
...
背景
有时候在接口对接数据时,常常会碰到这样的问题,就是请求接口的时候,他没有返回你想要的数据,而是返回一个“登录界面”的html,你说蛋疼不蛋疼......
而出现这种情况是需要进行登录验证的,那么,我们该如何做呢?
实现
利用cookie跳过登录
利用Cookie跳过登录原理就是登录过一次,查看登录后的header和cookie信息,将其关键信息拿下来,然后将这些信息加入你的接口请求头信息中。
在没登录的时候,去请求这个接口肯定是拿不到数据的,所以我们就需要让其将登录的接口url提供过来
思路如下:
- 首先需要对方提供登录的接口url(当然得包括登录用户跟密码这些参数);
- 我们在从url里面获取用户登录的cookie;
- 有了登录cookie之后,在调用方法接口的时候,我们将cookie给塞进去
- 调用方法接口成功返回数据而不再是登录的html。
参数说明
-
String cookie = conn.getHeaderField("Set-Cookie"); getHeaderField(“”)方法,及获取链接内的参数,此处获取的是cookie,注意:HttpURLConnection中的cookie命名为“Set-Cookie”
cookie取出来的值为"JSESSIONID=xxx; Path=/xxx; HttpOnly",我们所需要的信息就是这个JSESSIONID,将其取出来
代码
- 获取cookie代码
public static String getJsessionId(String path,String data) throws Exception {
URL url = new URL(path);
//打开和url之间的连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//获取cookie
String jsessionId = conn.getHeaderField("Set-Cookie").split(";")[0].split("=")[1].trim();
return jsessionId;
}
2. 接口对接数据代码
public static String interfaceUtil(String path,String data,String jsessionId) {
StringBuffer sb = new StringBuffer();
try {
String str = "";
URL url = new URL(path);
//打开和url之间的连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
PrintWriter out = null;
//请求方式
// conn.setRequestMethod("POST");
//设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
//利用cookie跳过拦截
conn.setRequestProperty("Cookie", "JSESSIONID="+jsessionId);
conn.setDoOutput(true);
conn.setDoInput(true);
//获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
//发送请求参数即数据
out.print(data);
//缓冲数据
out.flush();
//获取URLConnection对象对应的输入流
InputStream is = conn.getInputStream();
//构造一个字符流缓存
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while ((str = br.readLine()) != null) {
sb.append(str);
}
//关闭流
is.close();
//断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
//固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
延伸
对于HttpURLConnection这个类,我们可以深入一下(因为上述获取cookie的时候也是费了不少劲,所以想详说一下)
针对于获取Header问题的两个方法
1. getHeaderFields();
2. getHeaderField();
-
getHeaderFields()
这个方法是HttpURLConnection获取到的所有的头参数,