2012-01-31 14 views
63

necesito para recibir un mensaje multiparte HTTP que contiene sólo 2 parámetros:RESTO - HTTP Post multiparte con JSON

  • Un JSON cadena
  • Un archivo binario

¿Cuál es la forma correcta para establecer el cuerpo? Voy a probar la llamada HTTP utilizando la consola REST de Chrome, por lo que me pregunto si la solución correcta es establecer una clave de "etiqueta" para el parámetro JSON y el archivo binario.

En el lado del servidor que estoy usando Resteasy 2.x, y voy a leer varias partes del cuerpo como esto:

@POST 
@Consumes("multipart/form-data") 
public String postWithPhoto(MultipartFormDataInput multiPart) { 
    Map <String, List<InputPart>> params = multiPart.getFormDataMap(); 
    String myJson = params.get("myJsonName").get(0).getBodyAsString(); 
    InputPart imagePart = params.get("photo").get(0); 
    //do whatever I need to do with my json and my photo 
} 

Es este el camino a seguir? ¿Es correcto recuperar mi cadena JSON utilizando la clave "myJsonName" que identifica esa determinada disposición de contenido? ¿Hay alguna otra manera de recibir estos 2 contenidos en una solicitud HTTP multiparte?

Gracias de antemano

+1

¿Qué tipo de recurso REST es esto? ¿Cómo se relacionan dos partes en el nivel de recursos? –

+0

En realidad, la forma en que manejamos este recurso no es totalmente RESTful porque la imagen es un "componente" del recurso en lugar de otro recurso. – thermz

Respuesta

118

Si he entendido bien, se quiere componer una solicitud de varias partes manualmente desde una consola HTTP/REST. El formato multiparte es simple; una breve introducción se puede encontrar in the HTML 4.01 spec. Debe llegar a un límite, que es una cadena que no se encuentra en el contenido, digamos HereGoes. Establece el encabezado de solicitud Content-Type: multipart/form-data; boundary=HereGoes. Entonces este debe ser un cuerpo de solicitud válido:

--HereGoes 
Content-Disposition: form-data; name="myJsonString" 
Content-Type: application/json 

{"foo": "bar"} 
--HereGoes 
Content-Disposition: form-data; name="photo" 
Content-Type: image/jpeg 
Content-Transfer-Encoding: base64 

<...JPEG content in base64...> 
--HereGoes-- 
+1

Eso es exactamente lo que necesito leer :-) Gracias – thermz

+0

En realidad, puede agregar un archivo adjunto en soap-ui también. Esto alivia tener que pasar en el cuerpo del mensaje real y el tipo de contenido. –

+0

¡Explicación brillante! – abbasdgr8

Cuestiones relacionadas