Как отправить запрос POST JSON с помощью Apache HttpClient?

91

У меня примерно следующее:

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
Вы NameValuePairпросто добавляете параметр запроса, вы не отправляете JSON в своем коде. Какую структуру JSON ожидает получить сервис, какие данные отправлять? Вы ищете postMethod.setRequestEntity()с , StringRequestEntityкоторый содержит ваш JSON.
Филипп Рейхарт,

Ответы:

188

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);
янозид
источник
Как добавить json в geturl?
Mr Lou
1
Всегда хотел знать, parameterможно ли добавить к нему POSTMethodи одновременно установить RequestEntityдля него? Я знаю, это звучит нелогично, но просто любопытно.
asgs 08
33
Для тех, кому интересно, StringRequestEntityбыл заменен на StringEntity.
Alex
9
В более поздних выпусках HttpClient PostMethod был заменен HttpPost.
Aviro
1
Ссылка json не работает
Саймон К.
19

Для 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

проект Commons HttpClient подошел к концу и больше не разрабатывается. Он был заменен проектом Apache HttpComponents в его модулях HttpClient и HttpCore.

Чжаоган
источник
3

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