Wie poste ich eine JSON-Anfrage mit Apache HttpClient?
Lesezeit: 3 Minuten
Noel Jap
Ich habe etwas wie das Folgende:
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 500 zurück. Der Dienstanbieter sagt, ich muss JSON senden. Wie wird das mit Apache HttpClient 3.1+ gemacht?
Dein NameValuePair fügt nur einen Anforderungsparameter hinzu, Sie senden kein JSON in Ihrem Code. Welche JSON-Struktur erwartet der Dienst, was sollen Ihre Daten senden? Du schaust nach postMethod.setRequestEntity() mit einer StringRequestEntity die Ihren JSON enthält.
– Philipp Reichart
21. August 2012 um 16:51 Uhr
Janosid
Apache HttpClient weiß nichts über JSON, daher müssen Sie Ihr JSON separat erstellen. Dazu empfehle ich, das Einfache auszuprobieren JSON-java Bibliothek aus json.org. (Wenn “JSON-java” nicht zu Ihnen passt, hat json.org eine große Liste von Bibliotheken, die in verschiedenen Sprachen verfügbar sind.)
Sobald Sie Ihren JSON generiert haben, können Sie ihn mit etwas wie 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 obige Antwort, wie in der Frage gefordert, gilt für Apache HttpClient 3.1. Um jedoch allen zu helfen, die nach einer Implementierung für den neuesten Apache-Client suchen:
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);
Wie kann man den json an das geturl anhängen?
– Herr Lu
10. Januar 2013 um 7:55 Uhr
Wollte schon immer mal wissen ob a parameter können ergänzt werden POSTMethod und gleichzeitig a setzen RequestEntity dazu? Ich weiß, es klingt unlogisch, aber nur neugierig.
– asg
8. März 2013 um 21:29 Uhr
Für diejenigen, die sich fragen, StringRequestEntity wurde ersetzt durch StringEntity.
– Alex
26. September 2014 um 3:39 Uhr
Bei späteren Versionen von HttpClient wurde PostMethod durch HttpPost ersetzt.
Das Commons HttpClient-Projekt ist nun ausgelaufen und wird nicht mehr weiterentwickelt. Es wurde durch das Apache HttpComponents-Projekt in seinen HttpClient- und HttpCore-Modulen ersetzt
Wie in der ausgezeichneten Antwort von erwähnt Janosidmüssen Sie die JSON-Zeichenfolge erstellen und als festlegen StringEntity.
Um die JSON-Zeichenfolge zu erstellen, können Sie jede Bibliothek oder Methode verwenden, mit der Sie vertraut sind. Die Jackson-Bibliothek ist ein einfaches Beispiel:
Ich verwende die JACKSON-Bibliothek, um das Objekt in JSON zu konvertieren und den Anforderungstext wie unten festzulegen. Hier ist ein vollständiges Beispiel.
Dein
NameValuePair
fügt nur einen Anforderungsparameter hinzu, Sie senden kein JSON in Ihrem Code. Welche JSON-Struktur erwartet der Dienst, was sollen Ihre Daten senden? Du schaust nachpostMethod.setRequestEntity()
mit einerStringRequestEntity
die Ihren JSON enthält.– Philipp Reichart
21. August 2012 um 16:51 Uhr