Установить кодировку ответа с помощью HttpClient 3.1 - PullRequest
3 голосов
/ 28 февраля 2011

Я использую org.apache.commons.httpclient.HttpClient и мне нужно настроить кодировку ответа (по какой-то причине сервер возвращает неправильную кодировку в Content-Type).Мой способ - получить ответ в виде необработанных байтов и преобразовать его в String с нужной кодировкой.Мне интересно, есть ли какой-нибудь лучший способ сделать это (например, настроить HttpClient).Спасибо за предложения.

Ответы [ 4 ]

3 голосов
/ 28 февраля 2011

Не думаю, что есть лучший ответ, используя HttpClient 3.x API.

Спецификация HTTP 1.1 ясно говорит, что клиент "должен" уважать набор символов, указанный в заголовке ответа, и использовать ISO-8859-1, если набор символов не указан. API HttpClient разработаны с учетом того, что программист хочет соответствовать спецификациям HTTP. Очевидно, что вам нужно нарушить правила в спецификации, чтобы вы могли общаться с несовместимым сервером. Несмотря на это, это не тот случай использования, который разработчики API считали необходимым явно поддерживать.

Если вы используете HttpClient 4.x, вы можете написать свой собственный ResponseHandler для преобразования тела в HttpEntity, игнорируя условный набор символов ответного сообщения.

2 голосов
/ 28 февраля 2011

Несколько замечаний:

  1. Сервер обслуживает данные, поэтому сервер должен обслуживать их в соответствующем формате.Таким образом, кодировка ответа устанавливается сервером, а не клиентом.Тем не менее, клиент может предложить серверу, какой формат он хочет, через Accept и Accept-Charset :

    Accept: text/plain
    Accept-Charset: utf-8
    

    Однако http-серверы обычно не преобразуют между форматами.*

  2. Если опция 1. не работает, то вам стоит взглянуть на конфигурацию сервера.

  3. Когда строка отправляется в виде необработанных байтов (и это всегда так, потому что это то, что передают сети), всегда определено кодирование.Поскольку сервер производит эти необработанные байты, он определяет кодировку.Таким образом, вы не можете брать необработанные байты и использовать кодировку по вашему выбору для создания строки.Вы должны использовать кодировку, которая использовалась при преобразовании из строки в байты.

0 голосов
/ 10 марта 2011

Привет, ребята,

Jus, если кто-то найдет этот пост, гуглит для настройки HttpClient для записи в UTF-8.

Эта строка кода должна быть удобной ...

response.setContentType("text/html; charset=UTF-8");

Лучший

0 голосов
/ 01 марта 2011

Отказ от ответственности: я на самом деле не знаю HttpClient, только читая API.

Я бы использовал метод execute, возвращающий HttpResponse, тогда .getEntity().getContent(). Это чистый байтовый поток, поэтому, если вы хотите игнорировать кодировку, сообщаемую сервером, вы можете просто обернуть вокруг него свой собственный InputStreamReader.


Хорошо, похоже, у меня была неправильная версия (очевидно, там слишком много HttpClient классов).

Но так же, как и раньше, просто находится в других классах: HttpMethod имеет метод getResponseBodyAsStream(), вокруг которого вы можете теперь обернуть свой собственный InputStreamReader. (Или получите весь массив за раз, если он не слишком большой, и преобразуйте его в String, как вы написали.)

Я думаю, что пытаться изменить ответ и позволить HttpClient анализировать его здесь не совсем правильно.


Я предлагаю отправить администратору сервера / веб-мастеру сообщение о неправильной кодировке.

...