Клиент Джерси забывает принять заголовки при перенаправлении - PullRequest
1 голос
/ 23 июня 2011

Я пытаюсь использовать Джерси в качестве клиента для приложения RESTful. В частности, я хотел бы POST немного JSON на сервер и вернуть JSON, поэтому мой код выглядит следующим образом:

final JSONObject config = new JSONObject();
clientConfig.put("fooParam", 60 * 5); /* 5 min timeout */

final JSONObject newClient = client.resource(/* URL */).
                          type(MediaType.APPLICATION_JSON).
                          accept(MediaType.APPLICATION_JSON).
                          post(JSONObject.class, config);

генерирует ожидаемый HTTP-запрос с правильно установленными заголовками Content-Type и Accept. Теперь сервер решает создать запрошенный ресурс и перенаправляет туда , используя ответ HTTP/1.1 303 See Other (насколько я знаю, это хорошая практика). Хорошей новостью является то, что Джерси с радостью берет заголовок Location и действительно запрашивает ресурс, на который ему было сказано. Плохо то, что он, кажется, забыл, что я хотел получить только ресурсы application/json и отправил GET с

Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

, на который сервер отвечает счастливо (с совершенно легальным HTML). Я проверил это с помощью Wireshark. Проблема в том, что Джерси взрывается, потому что он не может разобрать это в JSONObject. Итак, мой вопрос

  • Правильно ли это поведение Джерси или, скорее, ошибка?
  • Есть ли какой-нибудь умный способ обойти это?

Я знаю, что мог бы пройти класс Джерси ClientResponse и посмотреть, перенаправлен ли я сам, но я думаю, что должен быть лучший способ сделать это.

1 Ответ

2 голосов
/ 24 июня 2011

После короткого разговора с Павлом в списке рассылки Джерси кажется, что проблема заключается в использовании класса HttpURLConnection из библиотек Java.Обойти это легко, используя библиотеку Apache HTTP Client для Jersey , которая прекрасно работает.

...