Как отправить сообщение с параметрами JSON с помощью Apache HttpClient 4.5. Получение 415 неподдерживаемых типов носителей

#java #apache #apache-httpclient-4.x

#java #apache #apache-httpclient-4.x

Вопрос:

Я пытаюсь отправить POST-запрос на мой сервер (используя Apache HttpClient 4.5) с заданным списком параметров JSON. Я ответил на некоторые вопросы SO, но столкнулся с проблемами.

Когда я использую консоль javascript для отправки запроса, это работает! Вот так:

 //Using JS console, I send a POST request and it works.
$.post('/createConfigData', {
    "tailSign": "A7ALE",
    "active": "Y"
});
//Get back 201
  

Когда я использую Apache HttpClient 4.5, чтобы попытаться сделать то же самое, что и выше, я получаю обратно 415 неподдерживаемых типов носителей:

 HttpPost httppost = new HttpPost('/createConfigData');
String jsondata = "{"tailSign": "A7ALE","active": "Y"}";

StringEntity jsonparam = new StringEntity(jsondata);
jsonparam.setContentType("application/json;charset=utf-8");
jsonparam.setChunked(true);

httppost.addHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
httppost.setEntity(jsonparam);

httpresponse = httpclient.execute(target, httppost);
  

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

  • Заголовки запроса:
    • Хост: «mysite.com «
    • Пользовательский агент: «Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 25.0) Gecko /20100101 Firefox / 25.0»
    • Принять: "*/*"
    • Принять-Язык: «en-US, en; q = 0,5»
    • Принять кодировку: «gzip, deflate»
    • Тип содержимого: «application/x-www-form-urlencoded; charset=UTF-8»
    • Реферер: «mysite.com/index.html «
    • Длина содержимого: «288»
    • Cookie: «JSESSIONID= …»
    • Прокси-авторизация: «Базовый …»
    • Соединение: «keep-alive»
    • Pragma: «no-cache»
    • Контроль кэша: «нет кэша»
  • Заголовки ответов:
    • Возраст: «0»
    • Соединение: «Keep-Alive»
    • Тип содержимого: «application/json; charset=UTF-8»
    • Дата: «Ср, 19 окт 2016 17:57:34 GMT»
    • Сервер: «Apache-Coyote / 1.1»
    • Передача-кодировка: «фрагментированный»

Я немного запутался в том, где установить тип контента, будь то сущность или httppost

=======================

Дополнительные тестовые примеры

Установка типа содержимого httpost в json дает мне 400

 HttpPost httppost = new HttpPost('/createConfigData');
String jsondata = "{"tailSign": "A7ALE","active": "Y"}";

StringEntity jsonparam = new StringEntity(jsondata);
jsonparam.setChunked(true);

httppost.addHeader("content-type", "application/json;charset=UTF-8");
httppost.setEntity(jsonparam);

httpresponse = httpclient.execute(target, httppost);
  

Установка типа содержимого httpost в x-www-form-urlencoded дает мне 415

 HttpPost httppost = new HttpPost('/createConfigData');
String jsondata = "{"tailSign": "A7ALE","active": "Y"}";

StringEntity jsonparam = new StringEntity(jsondata);
jsonparam.setChunked(true);

httppost.addHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
httppost.setEntity(jsonparam);

httpresponse = httpclient.execute(target, httppost);
  

Я также попытался добавить эту строку:

 httppost.addHeader("Accept", "*/*");
  

==================

РЕШЕНИЕ

Используя wireshark, я смог выяснить, что появилось сообщение об ошибке, которое сопровождается 400 ошибочным запросом! Просто мой JSON был неправильным.

 HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 19 Oct 2016 21:33:25 GMT
Proxy-Connection: Keep-Alive
Connection: Keep-Alive

{"code":400,"message":"Field ConfigName is Null, Invalid Value for Seat Count, Missing counts for DSU, ICMT, SVDU, TPMU, Login user details not found, Please enter valid lruData","fleetData":{"airlineData":null,"dimAircraftJson":null,"configData":null}}
  

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

1. Я пытался опубликовать XML через HttpClient и не смог найти способ, поэтому я переключился на Spring RestTemplate

2. Вы пытались проверить заголовки запросов, которые отправляет HttpClient? (для этого вы можете использовать Wireshark)

Ответ №1:

Вы получаете 415 неподдерживаемых типов носителей, поскольку ваш заголовок типа содержимого перезаписан в application/x-www-form-urlencoded; charset=UTF-8. Просто измените его на:

 HttpPost httppost = new HttpPost('/createConfigData');
String jsondata = "{"tailSign": "A7ALE","active": "Y"}";
StringEntity jsonparam = new StringEntity(jsondata);
jsonparam.setChunked(true);

httppost.addHeader("content-type", "application/json;charset=UTF-8");
httppost.setEntity(jsonparam);

httpresponse = httpclient.execute(target, httppost);
  

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

1. Когда я отправляю его с использованием x-www-form-urlencoded типа содержимого, я получаю 415 . Когда я отправляю, используя json тип содержимого, я получаю 400 . Я думаю, может быть, где-то он не принимает json в качестве типа. Я пытался добавить, httppost.addHeader("Accept", "*/*"); но все равно получил 400 .