HTTPBuilder устанавливает requestBody для метода GET

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


person Mikey    schedule 28.03.2012    source источник


Ответы (1)


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

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

person GVdP    schedule 05.04.2012