Jsoup 发送 post 请求,requestBody 为 json

本贴最后更新于 1153 天前,其中的信息可能已经东海扬尘
Jsoup默认发送请求时会将content-type设置成 application/x-www-form-urlencoded
这个时候如果想发送json的请求参数,即使你手动设置了content-type,jsoup也会替换成默认的,服务端将无法接受。
以下为jsoup设置head源码

// set up the request for execution 
String mimeBoundary = null;
if (req.data().size() > 0 && (!methodHasBody || hasRequestBody)) s
    erialiseRequestUrl(req)
else if (methodHasBody)
    mimeBoundary = setOutputContentType(req);
 

private static String setOutputContentType(final Connection.Request req) {
    String bound = null;  
if (needsMultipart(req)) {
        bound = DataUtil.mimeBoundary();  
req.header(CONTENT_TYPE, MULTIPART_FORM_DATA + "; boundary=" + bound);  
} else {
 req.header(CONTENT_TYPE, FORM_URL_ENCODED + "; charset=" + req.postDataCharset())
 }
 return bound
} 

 
根据源码我们发现jsoup会判断data有没数据,如果没数据就会设置默认的content-type。
那么解决方法就很简单了,我们设置一个任意的data数据即可 
Connection connection = Jsoup.connect(url);
connection.data("aaa","ccc");  //这是重点
 connection.header("Content-Type", "application/json; charset=UTF-8");  //这是重点
connection.header("Accept", "text/plain, */*; q=0.01");  
connection.timeout(15000);  
String body = "{\"CategoryType\":\"SiteHome\",\"ParentCategoryId\":0,\"CategoryId\":808,\"PageIndex\":2,\"TotalPostCount\":4000,\"ItemListActionName\":\"PostList\"}"
connection.requestBody(body);  
Document document = connection.post();
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    43 引用 • 179 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 337 关注

赞助商 我要投放

1 回帖
请输入回帖内容 ...
  • cdr

    怎么我用的不能发送请求体,connection.requestBody(body); 这一句我这边的 connection 是没有定义 requestBody 这个方法的。