调用别人接口如何跳过登陆

背景

有时候在接口对接数据时,常常会碰到这样的问题,就是请求接口的时候,他没有返回你想要的数据,而是返回一个“登录界面”的html,你说蛋疼不蛋疼......

而出现这种情况是需要进行登录验证的,那么,我们该如何做呢?

实现

利用cookie跳过登录

利用Cookie跳过登录原理就是登录过一次,查看登录后的header和cookie信息,将其关键信息拿下来,然后将这些信息加入你的接口请求头信息中。

在没登录的时候,去请求这个接口肯定是拿不到数据的,所以我们就需要让其将登录的接口url提供过来

思路如下:

  1. 首先需要对方提供登录的接口url(当然得包括登录用户跟密码这些参数);
  2. 我们在从url里面获取用户登录的cookie;
  3. 有了登录cookie之后,在调用方法接口的时候,我们将cookie给塞进去
  4. 调用方法接口成功返回数据而不再是登录的html。

参数说明

  1. String cookie = conn.getHeaderField("Set-Cookie"); getHeaderField(“”)方法,及获取链接内的参数,此处获取的是cookie,注意:HttpURLConnection中的cookie命名为“Set-Cookie”

    cookie取出来的值为"JSESSIONID=xxx; Path=/xxx; HttpOnly",我们所需要的信息就是这个JSESSIONID,将其取出来

代码

  1. 获取cookie代码
public static String getJsessionId(String path,String data) throws Exception {URL url = new URL(path);//打开和url之间的连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//获取cookieString 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();
  1. getHeaderFields()

    这个方法是HttpURLConnection获取到的所有的头参数,


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部