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参数包含编码文本而不是纯文本?
答案 0 :(得分:4)
Jsoup默认使用UTF-8对查询字符串进行URL编码。使用当前的API版本,您无法在不重建源的情况下进行更改(它是org.jsoup.helper.DataUtil#defaultCharset
类中使用的org.jsoup.helper.HttpConnection
常量)。最好的办法是post an issue report请求预先设置字符集的能力。
在此之前,您可以使用HttpClient
或URLConnection
代替,这样可以对发送HTTP请求进行更精细的控制。您最终可以将其响应作为InputStream
到Jsoup#parse()
方法提供。
更新:如果目标网站支持,您可以尝试在Content-Type
请求标头中明确指定客户端使用的字符集:
.header("Content-Type","application/x-www-form-urlencoded;charset=UTF-8")
请注意,您应不自己使用URLEncoder#encode()
;让Jsoup完成它的工作。