web-dev-qa-db-fra.com

REST - Multipartes de publication HTTP avec JSON

J'ai besoin de recevoir un post multipart HTTP qui ne contient que 2 paramètres:

  • Une chaîne JSON
  • Un fichier binaire

Quelle est la bonne façon de définir le corps? Je vais tester l'appel HTTP avec la console Chrome REST, je me demande donc si la solution appropriée consiste à définir une clé "label" pour le paramètre JSON et le fichier binaire.

Sur le serveur, j'utilise Resteasy 2.x, et je vais lire le corps multipart comme ceci:

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

Est-ce le chemin à parcourir? Est-il correct de récupérer ma chaîne JSON en utilisant la clé "myJsonName" qui identifie cette disposition de contenu particulière? Existe-t-il un autre moyen de recevoir ces 2 contenus en une seule requête HTTP en plusieurs parties?

Merci d'avance

83
thermz

Si je vous ai bien compris, vous souhaitez composer manuellement une demande en plusieurs parties à partir d'une console HTTP/REST. Le format en plusieurs parties est simple; une brève introduction peut être trouvée dans la spécification HTML 4.01 . Vous devez définir une limite, qui est une chaîne introuvable dans le contenu, disons HereGoes. Vous définissez l'en-tête de demande Content-Type: multipart/form-data; boundary=HereGoes. Cela devrait alors être un corps de requête valide:

--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--
137
Vasiliy Faronov