REST - HTTP Post Multipart con JSON


88

Ho bisogno di ricevere un HTTP Post Multipart che contiene solo 2 parametri:

  • Una stringa JSON
  • Un file binario

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

Sul lato server sto usando Resteasy 2.x, e leggerò il corpo Multipart in questo modo:

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

È questa la strada da percorrere? È corretto recuperare la mia stringa JSON utilizzando la chiave "myJsonName" che identifica quella particolare disposizione del contenuto? Esistono altri modi per ricevere questi 2 contenuti in una richiesta HTTP multiparte?

Grazie in anticipo


1
Che tipo di risorsa REST è questa? In che modo due parti sono correlate al livello di risorsa?

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

Risposte:


148

Se ti ho capito bene, vuoi comporre manualmente una richiesta multiparte da una console HTTP / REST. Il formato multiparte è semplice; una breve introduzione può essere trovata nelle specifiche HTML 4.01 . 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 della 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--

Puoi effettivamente aggiungere un allegato anche in soap-ui. Questo allevia la necessità di passare nel corpo del post effettivo e nel tipo di contenuto.
shane lee

1
Esiste un modo standardizzato per creare un confine unico?
andig

2
@andig non ne sono a conoscenza. Forse potresti usare un UUID , ma non è necessariamente una buona idea. Normalmente la tua libreria HTTP dovrebbe occuparsene per te.
Vasiliy Faronov

Se sappiamo di avere solo dati json e base64 nella richiesta, qualcosa come \*ad esempio non dovrebbe funzionare come limite? Non è consentito esistere né in json né in base64.
DaedalusAlpha

2
Perché usare base64 per codificare i dati JPEG? HTTP ti consente di inviare i byte grezzi.
Alexandre Blin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.