Jsoup通过curl Request设置header

使用Charles时发现它有一个功能非常的方便 。Copy cURL Request菜单 可以把请求中的header信息自动拼接成curl的参数。其实有很多的软件都具备这样的功能。那么如何把这些header信息直接 放到Jsoup的header中呢?一行一行的复制太麻烦了,于是我简单的封装了一下。

特点:

  • 支持Charles中复制的curl
  • 支持Chrome中复制的curl

其他格式,没经过测试,也有可能支持。


package com.ruoyi.wisvideo.utils;

import com.ruoyi.common.utils.StringUtils;
import org.jsoup.Connection;
import org.jsoup.Jsoup;

import java.io.*;
import java.util.*;

public class HttpUtil {
    
    
    public static void main(String[] args) throws Exception {
    
    
       //这个信息可以从`Copy cURL Request`菜单 复制
        String curlRequest = "curl -H \"Host: aaa.xxxx.com\" -H \"cache-control: no-cache\" -H \"user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat\" -H \"app-id: sdfasfdasfasdf\" ";
        String htmlSource = getHtml("https://aaa.xxxx.com/cd/classify?pageNum=1",curlRequest);
        System.out.println(htmlSource);
    }
    /**
     * 获取html信息
     * @param url 请求的url地址
     * @param headerInfo curl参数中的header信息
     * @return
     */
    public static String getHtml(String url,String headerInfo) {
    
    
        Connection connection = Jsoup.connect(url);
        Map<String,String> headerMap = getHeaders(headerInfo);
        for (Map.Entry<String, String> entry : headerMap.entrySet()) {
    
    
            connection.header(entry.getKey(), entry.getValue());
        }
        String json = null;
        try {
    
    
            json = connection.ignoreContentType(true).execute().body();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return json;
    }

    /**
     * 把list保存的信息进一步,转换Map对象
     * @param headerList
     * @return
     */
    private static Map<String,String> getHeadersByList(List<String> headerList){
    
    
        Map<String,String> map = new HashMap<>();
        if(headerList!=null&&headerList.size()>0){
    
    
            for (String item :
                    headerList) {
    
    
                int index = item.indexOf(": ");
                if(index>0){
    
    
                    String key = item.substring(0,index);
                    String value = item.substring(index+1);
                    map.put(key.trim(),value.trim());
                }
            }
        }

        return map;
    }

    /**
     * 获取header信息
     * @param curlRequest
     * @return
     */
    private static List<String> getHeadersByCURLRequestCharles(String  curlRequest) {
    
    
        if (StringUtils.isEmpty(curlRequest)) {
    
    
            return null;
        }
        List<String> result = new ArrayList<>();
        //去除没有用的数据
        curlRequest = curlRequest.replace("curl -H ","");
        curlRequest = curlRequest.substring(0,curlRequest.indexOf("--compressed"));
        String[] strArray = curlRequest.split("\\s-H\\s");
        for (String item :
                strArray) {
    
    
            item = item.trim();
            if(item.length()>=3){
    
    
                String firstStr = item.substring(0,1);
                String endStr = item.substring(item.length()-1);
                //双引号包裹的才算是正确的值
                if("\"".equals(firstStr)&&"\"".equals(endStr)){
    
    
                    //保存时不要两边的双引号
                    item =item.substring(1,item.length()-1);
                    //把转义的字还原回来
                    item = item.replace("\\\"","\"");
                    result.add(item);
                }
            }
        }
        return result;
    }

    /**
     * 新增chrome的格式的支持
     * @param curlRequest
     * @return
     */
    private static List<String> getHeadersByCURLRequestChrome(String  curlRequest){
    
    
        if (StringUtils.isEmpty(curlRequest)) {
    
    
            return null;
        }
        List<String> result = new ArrayList<>();
        //去除没有用的数据
        curlRequest = curlRequest.replace(" \\","");
        curlRequest = curlRequest.substring(0,curlRequest.indexOf("--compressed"));
        String[] strArray = curlRequest.split("\\s-H\\s");
        for (int i = 0; i < strArray.length; i++) {
    
    
            if(i==0){
    
    
                continue;
            }
            String item = strArray[i];
            item = item.trim();
            if(item.length()>=3){
    
    
                String firstStr = item.substring(0,1);
                String endStr = item.substring(item.length()-1);
                //双引号包裹的才算是正确的值
                if("'".equals(firstStr)&&"'".equals(endStr)){
    
    
                    //保存时不要两边的双引号
                    item =item.substring(1,item.length()-1);
                    //把转义的字还原回来
                    item = item.replace("\\\"","\"");
                    result.add(item);
                }
            }
        }

        return result;
    }

    /**
     * 新增chrome的格式的支持
     * @param curlRequest
     * @return
     */
    private static List<String> getHeadersByCURLRequest(String  curlRequest){
    
    
        //判断是哪类型
        String flag = curlRequest.substring(0,8);
        //chome风格的
        if("curl 'ht".equals(flag)){
    
    
            return getHeadersByCURLRequestChrome(curlRequest);
        }else if("curl -H ".equals(flag)){
    
    
            //Charles风格
            return getHeadersByCURLRequestCharles(curlRequest);
        }else{
    
    
            //不知道的话按chrome风格算
            return getHeadersByCURLRequestChrome(curlRequest);
        }
    }

    /**
     * 解析curl的header参数并获取header中的信息
     * @param curlRequest 这个内容可以源于一样软件自动生成的。比如:Charles 的Copy cURL Request 菜单
     * @return
     */
    public static Map<String,String> getHeaders(String curlRequest){
    
    
        List<String> list = getHeadersByCURLRequest(curlRequest);
        Map<String,String> headerMap = getHeadersByList(list);
        return headerMap;
    }
}


猜你喜欢

转载自blog.csdn.net/lxyoucan/article/details/125277545
今日推荐