2016-09-12 3 views
2

Я начал использовать JSoup для обработки своих HTTP-запросов, теперь у меня есть вопрос, на который я не могу найти ответ.JSoup Post Request encoding

Это мой код, используемый для соединения, который работает отлично:

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 как Content-Type.

Где я могу узнать, какая кодировка используется jsoup и как мне изменить кодировку, или достаточно просто добавить .header("Content-Type","application/x-www-form-urlencoded;charset=UTF-8")?

ответ

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

Вы можете добавить дополнительные поля заголовка путем добавления

.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 действительно кодирует параметры.

+0

Вопрос заключается в том, что Jsoup использует указанный заголовок для кодирования данных или использует что-то другое. Это не полностью отвечает на вопрос. –

+1

@MeikVtune: JSoup не может «использовать заголовок». Заголовок предназначен для сервера получателя, чтобы он знал, чего ожидать при обработке тела ответа. JSoup не может кодировать - он передает любой текст, который вы ему дали. –

+0

@AndreiVolgin Кодирование и декодирование должно выполняться с обеих сторон, насколько я знаю, что означает, что просто отправка заголовка с типом контента, который я не знаю, что это такое с JSoup, не может быть ответом. Если JSoup кодирует данные в «application/x-www-form-urlencoded» в качестве стандарта, то это работа, которую я пытаюсь выяснить. –