2014-02-28 7 views
13

Ich versuche, einen http POST mit den Beispielen von Apache Components (4.3) - http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/fluent.html zu erstellen. Leider erhalte ich einen Fehler, den ich nicht lösen konnte.Wie spricht man fließend mit Apache-Komponenten?

Ich habe die ehemalige HttpClient vor - also das ist meine erste mit Komponenten gehen.

Hier ist ein Ausschnitt aus dem Code:

String address = "http://1.1.1.1/services/postPositions.php"; 
String response = Request.Post(address) 
     .bodyString("Important stuff", ContentType.DEFAULT_TEXT) 
     .execute().returnContent().asString(); 
System.out.println(response); 

und wenn ich diesen Code ausführen erhalte ich eine Ausnahme:

Exception in thread "main" java.lang.IllegalStateException: POST request cannot enclose an entity 
    at org.apache.http.client.fluent.Request.body(Request.java:299) 
    at org.apache.http.client.fluent.Request.bodyString(Request.java:331) 
    at PostJson.main(PostJson.java:143) 

ich versucht habe, als auch ein Formularelement zu bauen und nutzen die bodyForm() Methode - aber ich bekomme den gleichen Fehler.

Antwort

6

Ich hatte das gleiche Problem, die Lösung ist Apache Client 4.3.1 zu verwenden, die funktioniert.

Es scheint, dass der Antrag geändert wurde:

  • in 4.3.1 sie öffentlich HttpRequestBase
  • in der aktuellen Version verwenden, verwenden sie das Paket geschützt InternalHttpRequest
+1

Der Wortlaut ist unklar. Sagen Sie, dass Sie *** das gleiche Problem hatten, und dies ist die Lösung, oder sagen Sie, dass Sie das gleiche Problem haben und immer noch nach einer Lösung suchen? –

+0

Klärte Antwort. – swKK

+0

Diese und die andere Antwort haben mir geholfen. Aber da diese Antwort mir einen Workaround brachte, entschied ich mich, dies als die richtige Antwort zu markieren ;-) –

1

Ich habe etwas gegraben und kann nicht sehen, wie es funktionieren kann (Sie haben vielleicht einen Fehler gefunden).

Der Fehler stammt von line 300 in Request in der neuesten Stammversion. Dort wird eine Überprüfung durchgeführt, um zu sehen, ob this.request instanceof HttpEntityEnclosingRequest, aber das ist nie wahr, weil this.request immer auf eine Instanz von InternalHttpRequest im Request-Konstruktor in Zeile 130 gesetzt ist, und InternalHttpRequest implementiert nicht org.apache.http.HttpEntityEnclosingRequest `.

+0

Danke für die Erklärung der Ursache. Diese Antwort ist auch korrekt - siehe obigen Kommentar ;-) –

1

Aus Gründen der Vollständigkeit Ich werde den Weg dazu schreiben, ohne die Fluent API zu benutzen. Auch wenn es nicht die Frage beantworten „Wie fließend von Apache-Komponenten verwenden“, ich denke, es lohnt sich, darauf hinzuweisen, dass der unten einfachstene Fall Lösung für Versionen arbeitet, die die Fehler haben:

public void createAndExecuteRequest() throws ClientProtocolException, IOException { 
    CloseableHttpClient httpclient = HttpClients.createDefault(); 
    HttpPost httppost = new HttpPost(host); 
    httppost.setEntity(new StringEntity("Payload goes here")); 
    try (CloseableHttpResponse response = httpclient.execute(httppost)) { 
     // do something with response 
    } 
} 

In meinem Fall, Downgrade war keine Option, also war dies die beste Lösung.