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

#java #rest #encoding #chunked

#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();
  

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

{Дата =[Чт, 13 Окт 2011 13:27:02 GMT], Vary=[Accept-Encoding, User-Agent], Transfer-Encoding=[фрагментированный], Keep-Alive=[тайм-аут = 15, макс = 100], Content-Type=[текст / html;кодировка = кодировка = UTF-8], Соединение = [Сохранить-Живой], X-Pad = [избежать ошибки браузера], Сервер = [Apache / 2.2.3 (Linux / SUSE)]}

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

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

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

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

. Проблема с чтением ответного сообщения, класс: класс java.lang.Строка, тип содержимого : текст / html;кодировка =кодировка= UTF-8. org.apache.cxf.jaxrs.client.Исключение ClientWebApplicationException: .Проблема с чтением ответного сообщения, класс : класс java.lang.Строка, тип содержимого : текст / html;кодировка =кодировка= 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

Существует ли простое решение для получения всего содержимого ответа?

Спасибо!

кон

Ответ №1:

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

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

аннотации для служб jax-rs

Ответ №2:

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

Проблемной частью является информация заголовка HTTP типа содержимого. Для него установлено значение:

 text/html; charset=charset=UTF-8
  

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

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

Комментарии:

1. Спасибо, Codo! Я как-то полностью пропустил это.