Кодирование фрагментов Java REST

Я пытаюсь прочитать некоторую информацию с помощью службы REST, которая использует кодирование фрагментов.

String encodedURL = URLEncoder.encode(url, "UTF-8");
WebClient client = org.apache.cxf.jaxrs.client.WebClient.create(encodedURL).accept("text/html");
Response response = client.get();

Ответ содержит статус, метаданные и сущность. Метаданные содержат следующую информацию:

{Date = [Thu, 13 Oct 2011 13:27:02 GMT], Vary = [Accept-Encoding, User-Agent], Transfer-Encoding = [chunked], Keep-Alive = [timeout = 15, max = 100] , Content-Type = [text / html; charset = charset = UTF-8], Connection = [Keep-Alive], X-Pad = [избежать ошибок браузера], Server = [Apache / 2.2.3 (Linux / SUSE)]}

и объект содержит экземпляр типа sun.net.www.protocol.http.HttpURLConnection $ HttpInputStream.

В прошлом я использовал следующую строку кода, чтобы получить всю строку результата:

String resultString = client.get(String.class);

Но почему-то эта строка вызывает исключение:

.Проблема с чтением ответного сообщения, класс: класс java.lang.String, ContentType: text / html; charset = charset = UTF-8. org.apache.cxf.jaxrs.client.ClientWebApplicationException:. Проблема с чтением ответного сообщения, класс: class java.lang.String, ContentType: text / html; charset = charset = UTF-8.

... вызванный:

Вызвано: java.io.UnsupportedEncodingException: charset = UTF-8 в sun.nio.cs.StreamDecoder.forInputStreamReader (Неизвестный источник) в java.io.InputStreamReader. (Неизвестный источник) в org.apache.cxf.helpers.IOUtils. toString (IOUtils.java:180) в org.apache.cxf.helpers.IOUtils.toString (IOUtils.java:166) в org.apache.cxf.jaxrs.provider.PrimitiveTextProvider.readFrom (PrimitiveTextProvider.java:51) в org .apache.cxf.jaxrs.client.AbstractClient.readBody (AbstractClient.java:435) ... еще 49

Есть ли простое решение для получения всего содержания ответа?

Спасибо!

кон


person kon    schedule 13.10.2011    source источник


Ответы (2)


Боюсь, что серверная сторона отправляет мусор и вызывает исключение на стороне клиента.

Проблемной частью является информация HTTP-заголовка Content-type. Он установлен на:

text/html; charset=charset=UTF-8

Как видите, слово кодировка повторяется. Таким образом, ваш клиент пытается декодировать его, используя кодировку charset=UTF-8, которой, конечно же, не существует.

Лучшим решением будет, если проблема будет устранена на стороне сервера. Но я не знаю, сможете ли вы исправить это там. Если нет, то следующий лучший подход - попытаться исправить заголовок HTTP, прежде чем пытаться получить содержимое ответа.

person Codo    schedule 13.10.2011
comment
Спасибо, Кодо! Я как-то совсем это упустил. - person kon; 14.10.2011

Вы можете использовать

@Produces("application/json; charset=UTF-8")

аннотации к сервисам jax-rs

person Community    schedule 20.09.2012