API REST - fichier (c'est à dire des images) traitement - les meilleures pratiques

Nous développons serveur avec l'API REST, qui accepte et réponses avec JSON. Le problème est, si vous avez besoin de télécharger des images à partir du serveur vers le client.

Remarque aussi que je parle de cas d'utilisation, où l'entité (utilisateur) peut avoir des fichiers (carPhoto, licensePhoto) et ont aussi d'autres propriétés (nom, prénom, email...), mais lorsque vous créez un nouvel utilisateur, vous n'avez pas envoyer ces images, elles sont ajoutés après le processus d'enregistrement.


Les solutions je suis au courant, mais chacun d'entre eux ont quelques défauts

1. Utilisation multipart/form-data au lieu de JSON

bonne : requêtes POST et PUT sont aussi Reposant que possible, ils peuvent contenir du texte des entrées en collaboration avec le fichier.

contre : Il n'est pas du JSON en plus, ce qui est beaucoup plus facile à tester, déboguer etc. comparer à multipart/form-data

2. Permettre de mettre à jour des fichiers séparés

Requête POST pour la création d'un nouvel utilisateur ne permet pas d'ajouter des images (ce qui est normal dans notre cas d'utilisation comment je l'ai dit au début), en téléchargeant des images se fait par requête PUT que multipart/form-data par exemple /users/4/carPhoto

bonne : Tout (sauf le téléchargement du fichier lui-même) reste en JSON, il est facile de tester et de déboguer (vous pouvez vous connecter remplir JSON demandes sans avoir peur de leur longueur)

contre : Il n'est pas intuitif, vous ne pouvez pas POSTER ou METTRE toutes les variables de l'entité à la fois et aussi cette adresse /users/4/carPhoto peut être considéré comme une collection (de série de cas d'utilisation de l'API REST ressemble à ceci /users/4/shipments). Habituellement, vous ne pouvez pas (et ne veux pas) GET/PUT chaque variable de l'entité, par exemple les utilisateurs/4/nom . Vous pouvez obtenir le nom avec les OBTENIR et de les modifier à METTRE dans utilisateurs/4. Si il y a quelque chose après la id, il est généralement une autre collection, comme les utilisateurs/4/examens

3. Utilisation Base64

L'envoyer en JSON mais encoder les fichiers avec Base64.

bonne : la Même que pour la première solution, il est plus Reposant de service possible.

contre : une Fois de plus, les tests et le débogage est bien pire (le corps peut avoir des méga-octets de données), il y a augmentation de la taille et aussi en temps de traitement à la fois client et serveur


Je tiens vraiment à utiliser la solution pas. 2, mais elle a ses inconvénients... quelqu'un peut me donner une meilleure idée de "quelle est la meilleure solution?

Mon but est d'avoir des services RESTful avec autant de normes que possible, alors que je veux le garder aussi simple que possible.

  • Vous pouvez également trouver cela utile: stackoverflow.com/questions/4083702/...
  • Je sais que ce sujet est vieux, mais nous avons dû faire face à ce problème récemment. La meilleure approche que nous avons obtenu est semblable à la vôtre numéro 2. Nous télécharger des fichiers directement à l'API et fixez ensuite ces fichiers dans le modèle. Avec ce scénario, vous pouvez créer des images de téléchargement avant, après ou à la même page que le formulaire n'a pas vraiment d'importance. Bonne discussion!
  • oui, exactement, je l'ai décrit dans l'une réponse qui j'ai récemment accepté
  • Merci pour cette question.
  • "aussi cette adresse /utilisateurs/4/carPhoto peut être considéré comme une collection" – non, il ne ressemble pas à une collection et ne serait pas nécessairement être considérés comme un seul. C'est très bien d'avoir une relation à une ressource qui n'est pas une collection, mais seule ressource.
  • Pour l'option 1 et 3 il y a un autre "con": Si vous envoyez plus d'une image dans un formulaire, le transfert de données peut être très large et dépasse fichier des restrictions de téléchargement sur votre serveur. La meilleure option est de 2
  • bon point

InformationsquelleAutor libik | 2015-10-22