2012-10-01 15 views
6

Me estoy comunicando con un servicio web que espera un parámetro POST y también espera el cuerpo de la solicitud. Confirmé que una solicitud POST de este tipo se puede realizar utilizando una REST Console que tengo, pero no puedo realizar dicha solicitud en Java utilizando las bibliotecas de Apache.¿Cómo puedo POST usar Java e incluir parámetros y un cuerpo de solicitud sin formato?

En el siguiente código, puedo ENVIAR al servicio web, y recibe correctamente los contenidos de la variable raw_body. Si elimino el comentario de la primera de las dos líneas comentadas, el servicio web recibe el parámetro "fname", pero ya no recibe el cuerpo del POST.

import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.methods.PostMethod; 
import org.apache.commons.httpclient.methods.RequestEntity; 
... 

HttpClient httpClient = new HttpClient(); 
String urlStr = "http://localhost:8080/MyRestWebService/save"; 
PostMethod method = new PostMethod(urlStr); 
String raw_body = "This is a very long string, much too long to be just another parameter"; 
RequestEntity re = new StringRequestEntity(raw_body, "text/xml", "UTF-16"); 
//method.addParameter("fname", "test.txt"); 
//httpClient.getParams().setParameter("fname", "test.txt"); 
method.setRequestEntity(re); 

¿Cómo puedo transmitir el parámetro y el cuerpo?

Respuesta

3

Puede usar el método setQueryString para agregar los parámetros a la URL a la que se está enviando. Desde una perspectiva RESTful, argumentaría que normalmente no debería estar haciendo eso, sin embargo, dado que un POST debería representar una llamada a un recurso y todo lo que calificaría para un parámetro de consulta debería incluirse en la representación que se transfiere en la solicitud. body ... o debería representar la calificación del recurso en sí, en cuyo caso debería ser parte de la ruta que se publica y que luego podría ser extraída por el controlador usando @ PathVariable/@ PathParam o algo similar. Entonces, en su caso, también podría estar buscando algo como POST /MyRestWebService/files/test.txt o, más apropiadamente, un PUT si está guardando el recurso y conoce el URI. El código en el servidor podría sacar el nombre de archivo de un patrón de URL.

+0

Ah, esto es perfecto. setQueryString es ** exactamente ** lo que necesitaba. Sus comentarios acerca de que esto no es muy tranquilo y que probablemente debería ser una solicitud PUT son bien recibidos. Gracias por dirigirme en la dirección correcta. –

3

Debe realizar una solicitud POST utilizando multiparte-formulario. Aquí está el ejemplo:

Apache HttpClient making multipart form post

Alternativamente, se puede hacer una petición POST con el contenido (parámetros y archivos) codificada utilizando application/x-www-form-urlencoded pero no se recomienda cuando se desea hacer una petición POST con gran contenido, como archivos.

+0

Esto me muestra cómo hacer una publicación de varias partes si tenía varios objetos grandes para enviar (lo que no es aplicable a mi problema), y no me da ninguna información sobre cómo incluir el parámetro que necesito pasar. –

+0

eso no es verdad. también se aplica a pequeños parámetros. no se recomienda agregar cadena de consulta a una solicitud POST. Algún software controlador de http puede no analizar la parte de consulta de una solicitud POST, ya que no está esperando eso. si no funciona en su servidor, esa puede ser la causa. siempre y cuando funcione en su servidor, utilice lo que mejor funcione para usted. pero desde el punto de vista del diseño, no es recomendable. – gigadot

Cuestiones relacionadas