HTTPBuilder устанавливает requestBody на метод GET - PullRequest
5 голосов
/ 29 марта 2012

Используя 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

Есть ли способ отправить GET с телом запроса, используя HTTPBuilder?

1 Ответ

2 голосов
/ 05 апреля 2012

Краткий ответ: Нет.

Длинный ответ: 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 с телом запроса

...