Як опублікувати запит 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.
Філіп Райхарт,

Відповіді:


187

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?
Містер Лу,

1
Завжди хотіли знати, чи parameterможна додати до нього POSTMethodі одночасно встановити RequestEntityдля нього a ? Я знаю, що це звучить нелогічно, але просто цікаво.
запитує

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));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.