Wie poste ich eine JSON-Anfrage mit Apache HttpClient?

89

Ich habe so etwas wie folgendes:

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();

Es kommt immer wieder mit einem 500 zurück. Der Dienstanbieter sagt, ich muss JSON senden. Wie geht das mit Apache HttpClient 3.1+?

Noel Yap
quelle
2
Sie NameValuePairfügen nur einen Anforderungsparameter hinzu, Sie senden keinen JSON in Ihrem Code. Welche JSON-Struktur erwartet der Dienst, welche Daten sollen gesendet werden? Sie suchen postMethod.setRequestEntity()mit einem StringRequestEntity, der Ihren JSON enthält.
Philipp Reichart

Antworten:

182

Apache HttpClient weiß nichts über JSON, daher müssen Sie Ihren JSON separat erstellen. Zu diesem Zweck empfehle ich, die einfache JSON-Java- Bibliothek von json.org zu besuchen . (Wenn "JSON-java" nicht zu Ihnen passt, bietet json.org eine große Liste von Bibliotheken in verschiedenen Sprachen.)

Sobald Sie Ihren JSON generiert haben, können Sie ihn mit dem folgenden Code POSTEN

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

Bearbeiten

Hinweis - Die in der Frage angeforderte Antwort gilt für Apache HttpClient 3.1. Um jedoch jedem zu helfen, der nach einer Implementierung für den neuesten Apache-Client sucht:

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);
Janosid
quelle
Wie kann der json an das geturl angehängt werden?
Herr Lou
1
Wollten Sie schon immer wissen, ob a parameterhinzugefügt werden kann POSTMethodund gleichzeitig ein a gesetzt werden RequestEntitykann? Ich weiß, es klingt unlogisch, aber nur neugierig.
Asgs
31
Für diejenigen, die sich fragen, StringRequestEntitywurde ersetzt durch StringEntity.
Alex
8
In späteren Versionen von HttpClient wurde PostMethod durch HttpPost ersetzt.
Aviro
1
json Referenzlink ist defekt
Simon K.
15

Für Apache HttpClient 4.5 oder eine neuere Version:

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

Hinweis:

1 Damit der Code kompiliert werden kann, sollten sowohl httpclientPaket als auch httpcorePaket importiert werden.

2 Try-Catch-Block wurde weggelassen.

Referenz : Appache offizielle Anleitung

Das Commons HttpClient-Projekt ist nun zu Ende und wird nicht mehr entwickelt. Es wurde durch das Apache HttpComponents-Projekt in seinen HttpClient- und HttpCore-Modulen ersetzt

ZhaoGang
quelle
2

Wie in der hervorragenden Antwort von janoside erwähnt , müssen Sie den JSON-String erstellen und als festlegenStringEntity .

Zum Erstellen der JSON-Zeichenfolge können Sie eine beliebige Bibliothek oder Methode verwenden, mit der Sie vertraut sind. Die Jackson-Bibliothek ist ein einfaches Beispiel:

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
quelle