Я пытаюсь использовать Джерси в качестве клиента для приложения 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
и посмотреть, перенаправлен ли я сам, но я думаю, что должен быть лучший способ сделать это.