您当前的位置: 首页 > 

ITKEY_

暂无认证

  • 0浏览

    0关注

    732博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Jsoup通过curl Request设置header

ITKEY_ 发布时间:2022-06-14 23:45:00 ,浏览量:0

使用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 headerMap = getHeaders(headerInfo);
        for (Map.Entry 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 getHeadersByList(List headerList){
        Map 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 getHeadersByCURLRequestCharles(String  curlRequest) {
        if (StringUtils.isEmpty(curlRequest)) {
            return null;
        }
        List 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 getHeadersByCURLRequestChrome(String  curlRequest){
        if (StringUtils.isEmpty(curlRequest)) {
            return null;
        }
        List 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 =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 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 getHeaders(String curlRequest){
        List list = getHeadersByCURLRequest(curlRequest);
        Map headerMap = getHeadersByList(list);
        return headerMap;
    }
}


关注
打赏
1665243900
查看更多评论
立即登录/注册

微信扫码登录

0.0403s