Попытка реплицировать успешный POST-запрос с помощью JSoup - данные, отправленные на сервер, не декодируются - PullRequest
3 голосов
/ 09 ноября 2011

Заголовок запроса 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, сервер видит его как обычный текст, а не закодированный текст. Как я могу заставить сервер понимать, что параметр сообщения содержит закодированный текст, а не простой текст?

1 Ответ

4 голосов
/ 09 ноября 2011

Jsoup по умолчанию использует UTF-8 для URL-кодирования строки запроса.В текущей версии API вы не можете изменить ее, не восстанавливая исходный код (это константа org.jsoup.helper.DataUtil#defaultCharset, используемая в классе org.jsoup.helper.HttpConnection).Лучшее, что вы можете сделать, - это опубликовать отчет о проблеме , запрашивающий возможность предварительно установить кодировку.

До этого вы можете использовать HttpClient или * 1010.*URLConnection вместо этого, что позволяет более тонко контролировать отправку HTTP-запросов.Вы можете, наконец, передать его ответ как InputStream к Jsoup#parse() методу.


Обновление : если целевой веб-сайт поддерживает его, вы можете попытаться явно указать используемый кодировкой клиентав заголовке запроса Content-Type:

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

Обратите внимание, что не следует использовать URLEncoder#encode() самостоятельно;пусть Jsoup сделает свое дело.

...