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

Android 尝试使用JSoup复制成功的POST请求-不会解码发送到服务器的数据,android,http,post,character-encoding,jsoup,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 message=%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC&securitytoken=XXX&do=postreply

Http请求头:

Host: www.mysite.com
Content-Type: application/x-www-form-urlencoded
Cookie: bbuserid=XXX; bbpassword=YYY; bbsessionhash=ZZZ
Content-Length: 252
message=%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC&securitytoken=XXX&do=postreply&t=483553
Http请求正文:

Host: www.mysite.com
Content-Type: application/x-www-form-urlencoded
Cookie: bbuserid=XXX; bbpassword=YYY; bbsessionhash=ZZZ
Content-Length: 252
message=%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC&securitytoken=XXX&do=postreply&t=483553
工作很好!发布到服务器的数据在另一端被解码,用户可以看到原始消息,即

现在,让我们尝试用JSoup实现这个EXACT示例:

//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();
//请求主体
Map datamap=newhashmap();
datamap.put(Session.Session_SECURITYTOKEN,“XXX”);
datamap.put(“message”,URLEncoder.encode(finalText,“ISO-8859-1”);
datamap.put(“do”,“postreply”);
datamap.put(“t”,“483553”);
//发帖
Jsoup.connect(url)
.header(“内容类型”、“应用程序/x-www-form-urlencoded”)
.超时(10000)
.cookie(Session.cookie\u哈希键,Session.bbsessionhash)
.cookie(Session.cookie\u密码\u密钥,Session.bbpassword)
.cookie(Session.cookie\u USERID\u KEY,Session.bbuserid)
.data(datamap.post();
我的消息已发布,但服务器未对其进行解码。因此,当用户查看他/她看到的消息时:
%E4%F6%F5%FC%E4%F6%F5%FC%E4%F6%F5%FC%E4%E4%F6%F5%FC

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


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

Jsoup默认使用UTF-8对查询字符串进行URL编码。对于当前的API版本,如果不重建源代码(它是
org.jsoup.helper.DataUtil#defaultCharset
常量,在
org.jsoup.helper.HttpConnection
类中使用)就无法更改它。您所能做的最好的事情是请求预先设置字符集的功能

在此之前,您可以使用或,它允许对发送HTTP请求进行更细粒度的控制。最后,您可以将其响应作为
InputStream
提供给
Jsoup#parse()
方法


更新:如果目标网站支持,您可以尝试在
内容类型
请求标头中显式指定客户端使用的字符集:

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

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

我不熟悉Jsoup,但我认为它正在
数据
方法中编码它的参数。因此,对一个值使用
urlcoder.encode
会对数据进行两次编码。删除
urlcoder.encode
会将纯文本添加到消息参数中,我会丢失需要编码的特定字符。working POST请求设法告诉服务器消息已编码,您(服务器)必须对其进行解码。但当我尝试复制它时,服务器将消息作为纯文本。任何想法,我如何让服务器理解消息参数保存的是编码文本,而不是纯文本?那么我是否理解正确,JSoup自动在UTF-8中对每个HTTP POST正文进行编码,并且不可能更改它(不编辑JSoup源代码并重新编译jar)?这是正确的。然而,Jsoup是一个相对较新的API,需要进行更多的微调,以更好地满足实际使用情况。欢迎新问题和功能请求。关于UTF-8的选择,请参见其
连接的最后一段
javadoc:;这很可能是因为Jsoup被设计成HTML5解析器,HTML5要求UTF-8作为默认字符集。你的目标网站仅仅是“过时”的观点:)请看答案更新;如果目标网站支持这一点,这将起作用,但如果目标网站不尊重这一点(这实际上是目标网站自己的错),也不要感到惊讶。