2012-03-28 178 views
5

使用cURL我可以發送一個帶有body的GET請求。例如:HTTPBuilder在GET方法上設置requestBody

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\"}]}" 

這裏是JSON在一個合理的格式可讀性的緣故:

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

通常-d會告訴捲曲發送一個職位,但我已經證實,-X GET壓倒一切的是,它是發送GET。 HTTPBuilder是否可以複製它?

我做:

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 
} 

其中一期工程,但如果我改變.post.get我得到的錯誤:

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 

有沒有一種方法用來發送一個請求體GET HTTPBuilder?

回答

2

簡短的回答:第

長的回答是:HTTPBuilder不會讓你設置HTTP方法在當實際創建的請求比其他任何時候的請求。 參數也在創建時由閉包檢查請求的類型,並在請求不是HttpEntityEnclosingRequest類型時拋出異常。

您可以查看源代碼在這裏:https://fisheye.codehaus.org/browse/gmod/httpbuilder/trunk/src/main/java/groovyx/net/http/HTTPBuilder.java?hb=true

在一個側面說明,在HTTP 1.1規範沒有直接說一個GET不能有身體,但它說,如果請求沒有按語義不允許使用一個,那麼一定不能提供,並且接收這些請求的服務器應該忽略它。

由於大多數人都習慣於這種慣例,所以我會建議堅持下去,並且在發送GET請求時不要讓您的服務實際使用正文。

另請參見此問題:HTTP GET with request body