it-roy-ru.com

Как POST запросить 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+?

78
Noel Yap

Apache HttpClient ничего не знает о JSON, поэтому вам нужно создать свой JSON отдельно. Для этого я рекомендую проверить простую библиотеку JSON-Java из json.org . (Если "JSON-Java" вам не подходит, у json.org есть большой список библиотек, доступных на разных языках.)

Создав JSON, вы можете использовать что-то вроде приведенного ниже кода для POST его

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);
159
janoside

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

6
ZhaoGang

Как отмечено в превосходном ответе 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));
1
ADTC