使用cURL我可以发送一个正文的GET请求。例如:
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
会告诉cURL发送一个POST,但我已经确认-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
有没有办法使用HTTPBuilder向请求正文发送GET?
答案 0 :(得分:2)
简短回答:不。
答案很长:HTTPBuilder不允许您在实际创建请求之外的任何时间为请求设置HTTP方法。 参数也在由闭包创建时设置,该闭包检查请求的类型,如果请求不是HttpEntityEnclosingRequest类型则抛出该异常。
另一方面,HTTP 1.1规范并未直接说明GET不能拥有正文,但它表示如果请求语义不允许,那么就不能提供它,那么接收此类请求的服务器应该忽略它。
由于大多数人习惯于这种惯例,我建议坚持使用它,并且在发送GET请求时不要让你的服务实际使用正文。
另请参阅此问题:HTTP GET with request body