Wie poste ich eine JSON-Anfrage mit Apache HttpClient?

Lesezeit: 3 Minuten

Benutzer-Avatar
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


Benutzer-Avatar
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.

    – Aviro

    31. Oktober 2014 um 16:47 Uhr

  • json-Referenzlink ist defekt

    – SimonK.

    25. Juli 2016 um 13:40 Uhr

Benutzer-Avatar
ZhaoGang

Zum Apache HttpClient 4.5 oder 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);

Notiz:

1, um den Code kompilieren zu lassen, beides httpclient Paket u httpcore Paket importiert werden soll.

2 Try-Catch-Block wurde weggelassen.

Bezug:
Offizieller Appache-Leitfaden

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:

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

Ich verwende die JACKSON-Bibliothek, um das Objekt in JSON zu konvertieren und den Anforderungstext wie unten festzulegen. Hier ist ein vollständiges Beispiel.

try (CloseableHttpClient httpclient = HttpClients.createDefault()) {

    HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");

    Post post = new Post("foo", "bar", 1);
    ObjectWriter ow = new ObjectMapper().writer();
    String strJson = ow.writeValueAsString(post);
    System.out.println(strJson);

    StringEntity strEntity = new StringEntity(strJson, ContentType.APPLICATION_JSON);
    httpPost.setEntity(strEntity);
    httpPost.setHeader("Content-type", "application/json");

    try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
        System.out.println(response.getCode() + " " + response.getReasonPhrase());

        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        System.out.println(result);

        EntityUtils.consume(entity);
    } catch (ParseException e) {
        e.printStackTrace();
    }

} catch (IOException e) {
    System.out.println(e.getMessage());
}

1299160cookie-checkWie poste ich eine JSON-Anfrage mit Apache HttpClient?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy