2012-01-31 18 views
63

ho bisogno di ricevere un messaggio Multipart HTTP che contiene solo 2 parametri:REST - HTTP Post Multipart con JSON

  • Un JSON stringa
  • Un file binario

Qual è il modo corretto per impostare il corpo? Sto testando la chiamata HTTP utilizzando la console REST di Chrome, quindi mi chiedo se la soluzione corretta è impostare una chiave "etichetta" per il parametro JSON e il file binario.

Sul lato server che sto utilizzando Resteasy 2.x, e ho intenzione di leggere il corpo Multipart come questo:

@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 
} 

E 'questa la strada da percorrere? È corretto recuperare la mia stringa JSON utilizzando la chiave "myJsonName" che identifica quel particolare contenuto-disposizione? C'è un altro modo per ricevere questi 2 contenuti in una richiesta multipart HTTP?

Grazie in anticipo

+1

Che tipo di risorsa REST è presente? In che modo due parti si riferiscono al livello di risorse? –

+0

In realtà il modo in cui gestiamo questa risorsa non è totalmente RESTful perché l'immagine è un "componente" della risorsa invece di un'altra risorsa. – thermz

risposta

118

Se ho capito bene, si vuole comporre una richiesta di più parti manualmente da una console HTTP/REST. Il formato multipart è semplice; una breve introduzione può essere trovata in the HTML 4.01 spec. Devi trovare un confine, che è una stringa non trovata nel contenuto, diciamo HereGoes. Imposta l'intestazione della richiesta Content-Type: multipart/form-data; boundary=HereGoes. Quindi questo dovrebbe essere un corpo di richiesta valido:

--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

Questo è esattamente ciò che ho bisogno di leggere :-) grazie – thermz

+0

In realtà puoi aggiungere un allegato anche a soap-ui. Questo allevia dover passare nel corpo del post effettivo e il tipo di contenuto. –

+0

Spiegazione brillante! – abbasdgr8