#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
.