Jsoup通过curl Request设置header

2023-05-16

使用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;
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jsoup通过curl Request设置header 的相关文章

  • 当 URL 可在浏览器中访问时,SSH Curl 不起作用

    This post is linked with another post of mine still unsolved Laravel 作曲家更新 连接被拒绝 https stackoverflow com questions 52404
  • 获取发送 cURL 请求的用户的 IP 地址

    我想获取使用 php 中的 cURL POST 方法向我的服务器发送请求的用户的 IP 地址 我正在开发一个 Flight API 我将使用 cURL POST 方法获取请求 我必须获取客户端的 IP 地址并验证他的 IP 地址是否可用 如
  • 配置失败,因为找不到 libcurl

    我正在尝试使用从远程服务器提取一些 json 数据fromJSON gt server lt http 111 111 000 00 3000 gt streams lt fromJSON paste server output strea
  • Mac 操作系统的 windows.h 替代品

    早上好 我正在使用 Codeblock c 程序进行编程 但是 我需要使用窗口 h and conio h MacBook 上没有这个头文件 拜托 你能帮我吗 不起作用的来源 void gotoxy int x int y COORD co
  • Stripe Connect - 检索访问令牌

    我正在尝试为 Rails 3 2 13 应用程序设置 Stripe Connect 我已将用户引导至 Stripe 并收到了来自 Stripe 的授权码 HTTP 1 1 302 Found Location http localhost
  • 致命错误:未捕获错误:调用未定义的函数curl_version() - Localhost Dev

    我正在尝试将 stripe 集成到我的 PHP 项目中 但在 localhost 上出现此错误 Fatal error Uncaught Error Call to undefined function curl version in 我正
  • 从 BitBucket 请求 OAuth 令牌

    在过去的 4 个小时里 我一直在尝试将 BitBucket 集成到我的应用程序中 但没有成功 在阅读的过程中BitBucket 的 RESTful API 文档 https confluence atlassian com display
  • 重用 Jsoup 连接

    我喜欢 Jsoup 来解析 html 但它们的连接有问题 我需要向同一个网站但不同的查询参数发送请求 比如 id XXX 请求如下 http website id XXX 我不想为每个 id 创建一个新连接 而是为所有 id 请求保留一个连
  • 使用 cURL 从 shell 发布 4GB 文件

    我尝试将文件大小为 4GB 的文件发布到 REST API cURL 不会上传此大小的文件 而是 POST 内容长度为 0 的文件 curl v i d work large png H Transfer Encoding chunked
  • 减少1000张图片的HTTP请求?

    我知道这个问题可能听起来有点疯狂 但我想也许有人会想出一个聪明的主意 假设您在一个 HTML 页面上有 1000 个缩略图 图像大小约为5 10 kb 有没有办法在单个请求中加载所有图像 以某种方式将所有图像压缩到一个文件中 或者您对该主题
  • Uber API 不允许来自本地主机的请求

    当我使用 Uber API 和 localhost 时 我收到以下错误 请求的资源上不存在 Access Control Allow Origin 标头 起源 http 本地主机 8080 http localhost 8080 因此不允许
  • 如何使用批处理脚本调用的curl 获取http post 请求的响应代码?

    我正在努力为从我们的工具之一发送 http post 请求提供支持 该工具基本上通过 http 请求执行作业 实现此目的的方法是该工具使用多个参数调用 RunScript bat 该脚本解析这些参数并在验证后发出curl post 请求 P
  • PHP curl exec 在 php 脚本相同域上失败

    我使用 php curl 从同一域 url 中的 php 脚本获取内容 但我收到curl exec 错误 curl 错误代码为 28 或操作超时 经过几天的调试 我发现它可以在 htm 等非脚本页面上工作 但不能在 php 上工作 如果 u
  • 如何编写 Perl 脚本来使用 curl 处理 URL?

    我有一个非常简单的任务 我有一个 crontab 每小时运行一个脚本 该脚本旨在简单地处理 URL 这就是我所拥有的 这不起作用 我收到语法错误 usr bin perl curl http domain com page html 我已经
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • curl 无法获取网页内容,为什么?

    我正在使用curl 脚本转到链接并获取其内容以进行进一步操作 以下是链接和curl脚本
  • HTTP Header Key 可以重复吗?

    在 JAVA HttpUrlConnection 中 请求 Header 设置的主要逻辑代码如下 public synchronized void set String k String v for int i nkeys i gt 0 i
  • 我什么时候应该使用 -inl.h 文件?

    我刚刚注意到这个项目 http google styleguide googlecode com svn trunk cppguide xml showone The inl h Files The inl h Files in the G
  • 上游太大 - nginx + codeigniter

    我从 Nginx 收到此错误 但似乎无法弄清楚 我正在使用 codeigniter 并使用数据库进行会话 所以我想知道标题怎么会太大 有没有办法检查标题是什么 或者看看我能做些什么来修复这个错误 如果您需要我提供任何conf文件或其他文件
  • 获取express.js中间件请求中“#”后的url

    我需要获取服务器中间件上的 url 使用express js 我用req url但是当 url 开头时 some urlreq url 返回 与req path 有没有办法获取url之后 在express js中 No URL 中以 符号永

随机推荐

  • mysql数据库的导出与导入

    在开发工作中和运维工作中 xff0c 数据库的备份与还原是很常见的工作 之前的工作中我使用oracle更多 xff0c mysql的备份工作参与的比较少 记录一下 xff0c 加深一下印象 准备工作 安装mysql客户端 xff0c 我喜欢
  • linux Windows双系统时间不一致的解决办法

    原因 电脑系统中有两个时间 xff1a 硬件时间 xff1a 保存在主板中 xff0c 信息比较少没时区 夏令时的概念 系统时间 xff1a 又系统维护 xff0c 独立于硬件时间 xff0c 拥有时区 夏令时等信息 系统时间又因为系统的不
  • 设计原则之【迪米特法则】,非礼勿近

    文章目录 一 什么是迪米特法则1 理解迪米特法则2 如何理解 高内聚 松耦合 xff1f 二 实例1 实例12 实例2 一 什么是迪米特法则 迪米特原则 xff08 Law of Demeter LoD xff09 是指一个对象应该对其他对
  • archlinux telnet客户端

    简单介绍 telnet是一种基于TCP的传统命令行远程控制协议 telnet使用非加密的通道 xff0c 因此不太安全 现在主要用于链接一些旧设备 下面这些介绍主要适用于在Arch Linux系统中配置一个telnet服务器 安装 如果只使
  • ASUS Vivobook安装linux

    使用ASUS Vivobook安装linux 会有一个小坑 如果你的linux启动不起来 xff0c 或者本来可以启动更新固件以后就不行了 这篇文章可能会给你一点帮助 BIOS设置 如果你想在这台电脑上安装linux 则Secure Boo
  • 修复grub启动 因调整分区导致linux无法启动解决过程

    linux调整分区后 xff0c 开机重启时会出现 error unknow filesystem grub rescue gt 我是windows11 43 archlinux双系统使用 这段时间用下来 xff0c 感觉使用linux更多
  • linux 扩容 新增分区

    一开始我只是尝试使用archlinux做为主要办公系统 xff0c 给系统分配的空间并不多 渐渐的也适应了archlinux感觉挺好 于是就把windows中占用的一些空间分配给archlinux用了 记录一下些过程吧 我把windows的
  • VirtualBox调整分分辨率

    以前在windows或者macOS基本都是使用vmware来玩虚拟机的 到linux环境 xff0c 想体验一下VirtualBox 结果用的时间发现分辨率都是调不出来 记录一下我的操作方法 环境 宿主机 xff1a archlinux 4
  • VirtualBox宿主机复制粘贴时有时无

    现象 首先我已经安装了增强功能 xff0c 共享剪切板选择的也是双向 虚拟机刚开机剪切板功能是正常的 可以双向复制 但是用了一段时间以后 xff0c 就会发现从宿主机得到到虚拟机就不行了 但是可以从虚拟机复制到宿主机 环境 我的宿主机是 a
  • HBuilderX运行微信小程序不报错也打不开

    我主用的是linux操作系统 xff0c 因为要开发微信小程序 所以在虚拟机中安装了一个windows7系统 环境 虚拟机中的windows7 HbuilderX 43 微信开发者工具 现象 使用HbuilderX开发uni app并想在微
  • Virtualbox虚拟机与主机相互访问

    刚从vmware切换到Virtualbox有些地方还是不太熟悉 网络连接这块就被卡了一下 xff0c 后来发现其实很简单 xff0c 是我想多了 环境 主机 xff1a archlinux 虚拟机 xff1a windows 10 软件版本
  • maven打包报内存不足,配置maven vm options

    服务器上内存所剩余不多了 xff0c 用mvn打包报内存不足 解决办法就要把vm options中内存设置小一些 mvn jvm config文件 xff1a 从 Maven 3 3 1 43 开始 xff0c 您可以通过 maven pr
  • archlinux滚动更新导致virtualbox虚拟机无法启动

    今天遇到一个奇怪的问题 xff0c 滚动更新以后 xff0c pacman Syyu 虚拟机无法正常启动了 虚拟机启动以后一直显示Starting virtual machine 并且卡在20 不动了 原因分析 我怀疑是更新系统后 xff0
  • 设计模式之【工厂模式】,创建对象原来有这么多玩法

    文章目录 一 什么是工厂模式1 工厂模式的意义2 什么时候应该用工厂模式 二 简单工厂模式1 实例 xff08 1 xff09 使用简单工厂进行优化 xff08 2 xff09 静态工厂 xff08 3 xff09 使用map来去除if x
  • archlinux安装node.js长期支持版本

    默认archlinux安装的node js版本是18 我今天在遇到项目时报错了 xff0c 项目中用到一个组件不支持18 那么如果安装 低版本的Node呢 xff1f 先在软件仓库中搜索一下 xff1a pacman Ss span cla
  • windows开机启动目录

    设置windows开机启动有很多种方法 xff0c 最简单的方法恐怕就是把快捷方式放到启动目录吧 windows开机启动目录 按下 win 43 R 打开运行输入 xff1a shell span class token operator
  • linux 灰度显示grayscale

    之前我在使用macOS的时候 xff0c 非常喜欢使用灰度显示界面 到底是什么原因让我有这么 变态 的需求 下面听听我的故事 xff0c 当时不重要 xff0c 可以跳过 是这样的 xff0c 因为我是程序员 xff0c 算上电脑 43 手
  • charles iOS手机抓包

    iOS手机如何抓包 下载charles https www charlesproxy com latest release download do 注册码 Registered Name span class token builtin c
  • redis cli笔记

    此篇为人个笔记 xff0c 基本是个人常用命令 xff0c 仅供参考 基础操作 redis cli redis span class token number 127 0 span 0 1 637 span class token oper
  • Jsoup通过curl Request设置header

    使用Charles时发现它有一个功能非常的方便 Copy cURL Request菜单 可以把请求中的header信息自动拼接成curl的参数 其实有很多的软件都具备这样的功能 那么如何把这些header信息直接 放到Jsoup的heade