2012-10-01 3 views
6

Ich kommuniziere mit einem Web-Service, der einen POST-Parameter erwartet und auch Request-Body erwartet. Ich habe bestätigt, dass eine solche POST-Anfrage mit einer vorhandenen REST-Konsole durchgeführt werden kann, aber ich kann keine solche Anfrage in Java mit Apache-Bibliotheken stellen.Wie kann ich POST mithilfe von Java und Parameter und eine unformatierte Anfrage Körper einfügen?

Im folgenden Code kann ich POST an den Webdienst senden, und es empfängt korrekt den Inhalt der Variablen raw_body. Wenn ich die erste der beiden kommentierten Zeilen auskommentiere, erhält der Web-Service den Parameter "fname", aber er empfängt nicht mehr den Hauptteil des POST.

import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.methods.PostMethod; 
import org.apache.commons.httpclient.methods.RequestEntity; 
... 

HttpClient httpClient = new HttpClient(); 
String urlStr = "http://localhost:8080/MyRestWebService/save"; 
PostMethod method = new PostMethod(urlStr); 
String raw_body = "This is a very long string, much too long to be just another parameter"; 
RequestEntity re = new StringRequestEntity(raw_body, "text/xml", "UTF-16"); 
//method.addParameter("fname", "test.txt"); 
//httpClient.getParams().setParameter("fname", "test.txt"); 
method.setRequestEntity(re); 

Wie kann ich sowohl den Parameter als auch den Körper übertragen?

Antwort

3

Sie können die Methode setQueryString verwenden, um die Parameter zu der URL hinzuzufügen, an die POST gesendet wird. Aus einer REST-Perspektive würde ich argumentieren, dass Sie dies normalerweise nicht tun sollten, da ein POST einen Aufruf an eine Ressource darstellen sollte und alles, was für einen Abfrageparameter geeignet wäre, sollte in der Repräsentation enthalten sein, die in der Anfrage übertragen wird body ... oder es sollte die Qualifizierung der Ressource selbst darstellen. In diesem Fall sollte es sich um einen Teil des Pfades handeln, der dann vom Controller mithilfe von @ PathVariable/@ PathParam oder ähnlichem extrahiert werden kann. Also in Ihrem Fall könnten Sie auch nach etwas wie POST /MyRestWebService/files/test.txt oder passender PUT suchen, wenn Sie die Ressource speichern und den URI kennen. Der Code auf dem Server könnte den Dateinamen aus einem URL-Muster herausziehen.

+0

Ah, das ist perfekt. setQueryString ist ** genau ** was ich brauchte. Ihre Kommentare darüber, dass es nicht sehr erholsam ist und auch, dass es wahrscheinlich eine PUT-Anfrage sein sollte, sind gut getroffen. Danke, dass du mich in die richtige Richtung gelenkt hast. –

3

Sie müssen eine POST-Anfrage mit Multipart-Formular durchführen. Hier ist das Beispiel:

Apache HttpClient making multipart form post

Alternativ Sie eine POST-Anforderung mit dem Inhalt machen können (Parameter und Dateien) codierten application/x-www-form-urlencoded aber es wird nicht empfohlen, wenn Sie eine POST-Anfrage mit großem Inhalt machen wollen, wie Dateien.

+0

Dies zeigt mir, wie man einen mehrteiligen Beitrag erstellt, wenn ich mehrere große Objekte senden musste (was für mein Problem nicht anwendbar ist), und gibt mir keine Informationen darüber, wie der Parameter, den ich benötige bestehen. –

+0

das ist nicht wahr. Es wird auch auf kleine Parameter angewendet. Das Hinzufügen einer Abfragezeichenfolge zu einer POST-Anforderung wird nicht empfohlen. Einige http-Handler-Software analysiert möglicherweise nicht den Abfrageteil einer POST-Anforderung, da dies nicht erwartet wird. Wenn es auf Ihrem Server nicht funktioniert, kann das die Ursache sein. Solange es auf Ihrem Server funktioniert, verwenden Sie, was am besten für Sie funktioniert. aber aus Sicht des Designs ist es nicht zu empfehlen. – gigadot

Verwandte Themen