JSoup Post Request编码

时间:2016-09-12 12:33:23

标签: java jsoup

我开始使用JSoup来处理我的HTTP请求,现在我有一个问题似乎无法找到答案。

这是我用于连接的代码,工作正常:

Jsoup.connect(uploadsite)
.cookies(cookies)urlencoded;charset=UTF-8")
            .data("Eintrag[]" , panel.teingangsdatum.getText(), "Ticket[]", panel.tticketnr.getText(),
            "DatumA[]", datumteile[2], "DatumB[]", datumteile[1], "DatumC[]", datumteile[0],
            "UhrzeitA[]", panel.tanfangsstunde.getText(), "UhrzeitB[]", panel.tanfangsminute.getText(),
            "UhrzeitC[]", panel.tendstunde.getText(), "UhrzeitD[]", panel.tendminute.getText(),
            "KundeA[]", kdname, "KundeB[]", panel.tkdnr.getText(), "HVT[]", 
            panel.thvt.getText(),
            "Techniker[]", "0", "Art[]", ticketart)
            .method(Method.POST)
            .execute();

我的问题是,为了发送德语umaults(“äÄöÖüÜ”),我需要发送内容为application/x-www-form-urlencoded作为内容类型。

我在哪里可以看到jsoup使用了什么编码?如何更改编码,或仅添加.header("Content-Type","application/x-www-form-urlencoded;charset=UTF-8")是否足够?

2 个答案:

答案 0 :(得分:2)

通过查看JSoup的源代码(我刚刚意识到它是公开的),我自己找到了答案。

简而言之:是的,Jsoup对application/x-www-form-urlencoded中的数据进行编码。

JSoup使用名为HttpConnection的内部帮助程序类

private static final String FORM_URL_ENCODED = "application/x-www-form-urlencoded";

已定义。这用于名为String setOutputContentType(final Connection.Request req)的内部方法,该方法由execute()方法调用。

虽然它确实对正文中的数据进行编码,但据我所知,它并没有设置内容类型。

答案 1 :(得分:1)

您可以通过附加

添加其他标题字段
.header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")

根据您的要求。

需要使用URLEncoder.encode(String s, String enc)

对数据进行编码

完整示例:

try {
        Response response = Jsoup.connect("http://localhost:8080")
            .method(Method.POST).data("fname", "ÄÖÜ-foobar").data("lname", "äöü1234")
            .header("Content-Type", "application/x-www-form-urlencoded")
            .postDataCharset("UTF-8")
            .execute();
    System.out.println(response.statusCode() + "\n" + response.parse().text());

} catch (IOException e) {
    e.printStackTrace();
}

从服务器输出(使用Jetty并使用请求getParameter(String name)检索请求参数,该参数已对参数进行解码):

200
Content Type: application/x-www-form-urlencoded; charset=UTF-8
ÄÖÜ-foobar äöü1234

读取原始数据返回

fname=%C3%84%C3%96%C3%9C-foobar&lname=%C3%A4%C3%B6%C3%BC1234

正如Meik Vtune在评论中正确指出的那样,jsoup确实对参数进行了编码。