尝试使用JSoup复制成功的POST请求 - 发布到服务器的数据不会被解码

时间:2011-11-08 23:53:24

标签: android http post character-encoding jsoup

Http请求标头:

Host: www.mysite.com
Content-Type: application/x-www-form-urlencoded
Cookie: bbuserid=XXX; bbpassword=YYY; bbsessionhash=ZZZ
Content-Length: 252

Http请求正文:

message=%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC&securitytoken=XXX&do=postreply&t=483553

工作正常!发布到服务器的数据在另一端被解码,用户看到原始消息äöõüäöõüäöõüäöõü

现在让我们尝试用JSoup实现这个精确的例子:

//request body 
Map<String, String> datamap = new HashMap<String, String>();
datamap.put(Session.SESSION_SECURITYTOKEN,"XXX");
datamap.put("message", URLEncoder.encode(finalText, "ISO-8859-1"));
datamap.put("do", "postreply");
datamap.put("t", "483553");

//make a post
Jsoup.connect(url)
.header("Content-Type","application/x-www-form-urlencoded")
.timeout(10000)
.cookie(Session.COOKIE_HASH_KEY,session.bbsessionhash)
.cookie(Session.COOKIE_PASSWORD_KEY,session.bbpassword)
.cookie(Session.COOKIE_USERID_KEY,session.bbuserid)
.data(datamap).post();

我的消息被发布但是它没有被服务器解码。因此,当用户查看他/她看到的消息时:%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC

注意:我正在做Android的发布请求并将数据发布到vBulletin论坛软件(重播到线程)。

问题:当我使用JSoup发送消息时,服务器将其视为纯文本而非编码文本。 如何让服务器理解message参数包含编码文本而不是纯文本?

1 个答案:

答案 0 :(得分:4)

Jsoup默认使用UTF-8对查询字符串进行URL编码。使用当前的API版本,您无法在不重建源的情况下进行更改(它是org.jsoup.helper.DataUtil#defaultCharset类中使用的org.jsoup.helper.HttpConnection常量)。最好的办法是post an issue report请求预先设置字符集的能力。

在此之前,您可以使用HttpClientURLConnection代替,这样可以对发送HTTP请求进行更精细的控制。您最终可以将其响应作为InputStreamJsoup#parse()方法提供。


更新:如果目标网站支持,您可以尝试在Content-Type请求标头中明确指定客户端使用的字符集:

.header("Content-Type","application/x-www-form-urlencoded;charset=UTF-8")

请注意,您应自己使用URLEncoder#encode();让Jsoup完成它的工作。