Тела HTTP Post запроса по-разному закодированы (кодировка) - PullRequest
1 голос
/ 27 декабря 2011

Ссылка на предыдущий вопрос: Получение ответа ajax в java из веб-метода (java.io.FileNotFoundException)

Я пытаюсь отправить POST-запрос, содержащий json в теле запроса, но тело кодируется по-разному при выполнении этого через веб-браузер (chrome) и мой java-код. Вот мой код:

String params = "{\"prefixText\":\"aCity\",\"count\":10,\"contextKey\":\"he\"}";
conn = (HttpURLConnection) new URL("http://bus.gov.il/WebForms/wfrmMain.aspx/GetCompletionList").openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setFixedLengthStreamingMode(params.length());
conn.addRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.addRequestProperty("Referer", "http://bus.gov.il/WebForms/wfrmMain.aspx?width=1024&company=1&language=he&state=");
Writer out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
out.write(params);
out.close();
String answer = readStream(conn.getInputStream(), "utf-8");

Вот 2 запроса, отправленных, как показано в Wireshark: ссылка (первый - хороший, второй - неправильно закодированный Java-запрос).

Я попытался изменить кодировку в Content-Type, но ничего не получилось.

Любая помощь будет высоко оценена.

1 Ответ

1 голос
/ 27 декабря 2011

Здесь вы используете кодировку символов по умолчанию для вашей системы:

Writer out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));

Вместо этого укажите явно кодировку в вызове конструктора для OutputStreamWriter:

Writer out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");

(Вам не нужно BufferedWriter здесь - это не приносит вам пользы.)

РЕДАКТИРОВАТЬ: Хорошо, теперь у вас есть проблема, потому что вы устанавливаете длину контента неправильно. Вам следует преобразовать текст в двоичный файл один раз , например:

byte[] data = params.getBytes("UTF-8");
conn.setFixedLengthStreamingMode(data.length);
...
OutputStream output = conn.getOutputStream();
// Note: you should use a finally block here
output.write(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...