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

背景

有时候在接口对接数据时,常常会碰到这样的问题,就是请求接口的时候,他没有返回你想要的数据,而是返回一个“登录界面”的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();
        
        //获取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();
  1. getHeaderFields()

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页