2012-03-28 20 views
5

Utilizando cURL puedo enviar una solicitud GET con un cuerpo. Ejemplo:HTTPBuilder establece requestBody en el método 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\"}]}" 

Aquí está el JSON en un formato razonable para el bien de la legibilidad:

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

Normalmente -d le dirá cURL para enviar un correo y no he confirmado que el -X GET está reemplazando y está enviando GET. ¿Es posible replicar esto con HTTPBuilder?

he hecho:

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 
} 

que trabaja, pero si cambio .post a .get me sale el error:

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 

¿Hay una manera de enviar un GET con un cuerpo de solicitud utilizando HTTPBuilder?

Respuesta

2

Respuesta corta: No.

Respuesta larga: La HTTPBuilder no le permite establecer el método HTTP de una petición en cualquier momento distinto a la hora de crear en realidad una petición. Los parámetros también se configuran en la creación mediante un cierre que verifica el tipo de solicitud y lanza esa excepción si la solicitud no es de tipo HttpEntityEnclosingRequest.

Puede comprobar el código fuente aquí: https://fisheye.codehaus.org/browse/gmod/httpbuilder/trunk/src/main/java/groovyx/net/http/HTTPBuilder.java?hb=true

En una nota, la especificación HTTP 1.1 no dice abiertamente que un GET no puede tener un cuerpo, pero dice que si una petición semántica doesn no permite uno, entonces no debe proporcionarse, y los servidores que reciben tales solicitudes deben ignorarlo.

Dado que la mayoría de la gente está acostumbrada a esa convención, le sugiero que se quede con ella y que su servicio no haga uso del cuerpo al enviar una solicitud GET.

Ver también esta pregunta: HTTP GET with request body

Cuestiones relacionadas