我开始使用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")
是否足够?
答案 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确实对参数进行了编码。