У меня примерно следующее:
final String url = "http://example.com";
final HttpClient httpClient = new HttpClient();
final PostMethod postMethod = new PostMethod(url);
postMethod.addRequestHeader("Content-Type", "application/json");
postMethod.addParameters(new NameValuePair[]{
new NameValuePair("name", "value)
});
httpClient.executeMethod(httpMethod);
postMethod.getResponseBodyAsStream();
postMethod.releaseConnection();
Он продолжает возвращать 500. Поставщик услуг говорит, что мне нужно отправить JSON. Как это делается с Apache HttpClient 3.1+?
NameValuePair
просто добавляете параметр запроса, вы не отправляете JSON в своем коде. Какую структуру JSON ожидает получить сервис, какие данные отправлять? Вы ищетеpostMethod.setRequestEntity()
с ,StringRequestEntity
который содержит ваш JSON.Ответы:
Apache HttpClient ничего не знает о JSON, поэтому вам нужно создать свой JSON отдельно. Для этого я рекомендую проверить простую библиотеку JSON-java с json.org . (Если "JSON-java" вам не подходит, на json.org есть большой список библиотек, доступных на разных языках.)
После того, как вы сгенерировали свой JSON, вы можете использовать что-то вроде кода ниже, чтобы отправить его.
StringRequestEntity requestEntity = new StringRequestEntity( JSON_STRING, "application/json", "UTF-8"); PostMethod postMethod = new PostMethod("http://example.com/action"); postMethod.setRequestEntity(requestEntity); int statusCode = httpClient.executeMethod(postMethod);
редактировать
Примечание. Приведенный выше ответ, как и в вопросе, относится к Apache HttpClient 3.1. Однако, чтобы помочь всем, кто ищет реализацию для последней версии клиента Apache:
StringEntity requestEntity = new StringEntity( JSON_STRING, ContentType.APPLICATION_JSON); HttpPost postMethod = new HttpPost("http://example.com/action"); postMethod.setEntity(requestEntity); HttpResponse rawResponse = httpclient.execute(postMethod);
источник
parameter
можно ли добавить к немуPOSTMethod
и одновременно установитьRequestEntity
для него? Я знаю, это звучит нелогично, но просто любопытно.StringRequestEntity
был заменен наStringEntity
.Для Apache HttpClient 4.5 или более новой версии:
CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://targethost/login"); String JSON_STRING=""; HttpEntity stringEntity = new StringEntity(JSON_STRING,ContentType.APPLICATION_JSON); httpPost.setEntity(stringEntity); CloseableHttpResponse response2 = httpclient.execute(httpPost);
Заметка:
1 для компиляции кода необходимо импортировать как
httpclient
пакет, так иhttpcore
пакет.2 опущен блок try-catch.
Ссылка : официальное руководство по appache
источник
Как упоминалось в отличном ответе janoside , вам нужно построить строку JSON и установить ее как
StringEntity
.Чтобы создать строку JSON, вы можете использовать любую удобную для вас библиотеку или метод. Библиотека Джексона - один из простых примеров:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; ObjectMapper mapper = new ObjectMapper(); ObjectNode node = mapper.createObjectNode(); node.put("name", "value"); // repeat as needed String JSON_STRING = node.toString(); postMethod.setEntity(new StringEntity(JSON_STRING, ContentType.APPLICATION_JSON));
источник