REST - HTTP Post Multipart avec JSON

88

J'ai besoin de recevoir un HTTP Post Multipart 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 à l'aide de la console Chrome REST, je me demande donc si la bonne solution est de définir une clé «étiquette» pour le paramètre JSON et le fichier binaire.

Du côté du serveur, j'utilise Resteasy 2.x, et je vais lire le corps de 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 la voie à suivre? Est-il correct de récupérer ma chaîne JSON à l'aide de 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

thermz
la source
1
De quel type de ressource REST s'agit-il? Quel est le lien entre deux parties au niveau des ressources?
En fait, la façon dont nous avons géré cette ressource n'est pas totalement REST car l'image est un "composant" de la ressource au lieu d'une autre ressource.
thermz

Réponses:

148

Si je vous comprends bien, vous souhaitez composer une requête en plusieurs parties manuellement à partir d'une console HTTP / REST. Le format multipart est simple; une brève introduction peut être trouvée dans la spécification HTML 4.01 . Vous devez trouver une limite, qui est une chaîne introuvable dans le contenu, disons HereGoes. Vous définissez l'en-tête de la demande Content-Type: multipart/form-data; boundary=HereGoes. Ensuite, cela devrait ê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--
Vasiliy Faronov
la source
Vous pouvez également ajouter une pièce jointe dans soap-ui. Cela évite d'avoir à transmettre le corps de l'article réel et le type de contenu.
shane lee
1
Existe-t-il un moyen standardisé de définir la limite unique?
andig
2
@andig Je n'en connais aucun. Vous pourriez peut-être utiliser un UUID , mais ce n'est pas nécessairement une bonne idée. Normalement, votre bibliothèque HTTP devrait s'en occuper pour vous.
Vasiliy Faronov
Si nous savons que nous n'avons que des données json et base64 dans la requête, quelque chose comme \*par exemple ne devrait-il pas fonctionner comme une limite? Il n'est pas permis d'exister dans json ou base64.
DaedalusAlpha
2
Pourquoi utiliser base64 pour encoder les données JPEG? HTTP vous permet d'envoyer les octets bruts.
Alexandre Blin