5

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 を送信する方法はありますか?

4

1 に答える 1

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

于 2012-04-05T09:27:57.787 に答える