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