2012-03-28 9 views
5

Mit cURL Ich kann eine GET-Anfrage mit einem Körper senden. Beispiel:HTTPBuilder set requestBody auf GET-Methode

curl -i -X GET http://localhost:8081/myproject/someController/l2json -H "content-type: application/json" -d "{\"stuff\":\"yes\",\"listThing\":[1,2,3],\"listObjects\":[{\"one\":\"thing\"},{\"two\":\"thing2\"}]}" 

Hier ist die JSON in einem angemessenen Format aus Gründen der Lesbarkeit:

{"stuff":"yes", 
"listThing":[1,2,3], 
"listObjects":[{"one":"thing"},{"two":"thing2"}]} 

Normalerweise -d wird cURL erzählen eine POST zu senden, aber ich habe bestätigt, dass die -X GET ist, dass zwingende und es ist Senden von GET. Ist es möglich, dies mit HTTPBuilder zu replizieren?

ich getan habe:

def http = new HTTPBuilder('http://localhost:8081/') 

http.post(path:'/myproject/myController/l2json', body:jsonMe, requestContentType:ContentType.JSON) { resp -> 
    println "Tweet response status: ${resp.statusLine}" 
    assert resp.statusLine.statusCode == 200 
} 

Welche funktioniert, aber wenn ich .post-.get ändern erhalte ich die Fehlermeldung:

Cannot set a request body for a GET method. Stacktrace follows: 
Message: Cannot set a request body for a GET method 
Line | Method 
->> 1144 | setBody    in groovyx.net.http.HTTPBuilder$RequestConfigDelegate 

Gibt es eine Möglichkeit, eine GET mit einem Anforderungstext senden mit HTTPBuilder?

Antwort

2

Kurze Antwort: Nein.

Lange Antwort: Die HTTPBuilder nicht funktioniert können Sie die HTTP-Methode für eine Anforderung jederzeit eingestellt andere, als wenn tatsächlich eine Anfrage zu schaffen. Parameter werden auch beim Erstellen durch eine Closure festgelegt, die den Typ der Anforderung überprüft und diese Ausnahme auslöst, wenn die Anforderung nicht vom Typ HttpEntityEnclosingRequest ist.

können Sie prüfen, den Quellcode hier: https://fisheye.codehaus.org/browse/gmod/httpbuilder/trunk/src/main/java/groovyx/net/http/HTTPBuilder.java?hb=true

Auf einer Seite zur Kenntnis, die HTTP 1.1-Spezifikation nicht gar nicht sagen, dass ein GET keinen Körper haben kann, aber es sagt, dass, wenn eine Anfrage Semantik doesn Ich erlaube es nicht, dann muss es nicht bereitgestellt werden und Server, die solche Anfragen erhalten, sollten es ignorieren.

Da die meisten Leute an diese Konvention gewöhnt sind, würde ich vorschlagen, dabei zu bleiben, und nicht Ihren Dienst tatsächlich nutzen den Körper beim Senden einer GET-Anfrage.

Siehe auch diese Frage: HTTP GET with request body