Как отправить запрос JSON с помощью Apache HttpClient?
У меня что-то вроде следующего:
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+?
2 ответов:
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);Edit
Примечание-приведенный выше ответ, как указано в вопросе, относится к 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);
Как уже упоминалось в отличном ответе 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));
Comments