Как опубликовать запрос 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 отдельно. Для этого я рекомендую проверить simple в 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);

Как упоминалось в отличном ответе 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));