meilleure approche pour la conception d'un service web rest avec des données binaires à être consommés à partir du navigateur
Je suis l'élaboration d'un json rest web services qui seront consommés à partir d'une seule page web app construit avec backbone.js
Cette API permettra aux consommateurs de télécharger des fichiers liés à une entité, à l'instar des rapports pdf liées à un projet
Googler autour et en faisant quelques recherche à débordement de pile je suis venu avec ces approches possibles:
Première approche: des données encodées en base64 champ
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
filename: 'xxxx',
filesize: 222,
content: '<base64 encoded binary data>'
}
Deuxième approche: multipart post de formulaire:
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
}
comme une réponse, je vais obtenir un id de rapport, et avec qui je délivre un autre post
POST: /api/projects/234/reports/1/content
enctype=multipart/form-data
et puis il suffit d'envoyer les données binaires
(avoir un coup d'oeil à ceci: https://stackoverflow.com/a/3938816/47633)
Troisième approche: après les données binaires d'une ressource distincte et enregistrer le href
j'ai d'abord générer une clé aléatoire sur le client et poste le contenu binaire il y
POST: /api/files/E4304205-29B7-48EE-A359-74250E19EFC4
enctype=multipart/form-data
et puis
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
filename: 'xxxx',
filesize: 222,
href: '/api/files/E4304205-29B7-48EE-A359-74250E19EFC4'
}
(voir ceci: https://stackoverflow.com/a/4032079/47633)
Je voulais juste savoir si il y a d'autres approches que je pouvais utiliser, les avantages/inconvénients de chacun, et si il n'y a de toute façon de traiter avec ce genre d'exigences
le gros con que je vois pour la première approche, c'est que je dois charger complètement et base64 encode le fichier sur le client
quelques ressources utiles:
- Post de données binaires pour une bonne application
- Ce qui est une bonne façon de transférer des données binaires à une HTTP API REST service?
- Comment puis-je transférer un fichier de métadonnées à l'aide d'un service web REST?
- Mauvaise idée de transfert de charge utile importante de l'utilisation de web services?
- https://stackoverflow.com/a/5528267/47633
Vous devez vous connecter pour publier un commentaire.
Mes résultats de la recherche:
Seule demande (données incluses)
La demande contient des métadonnées. Les données sont une propriété de métadonnées et codé (par exemple: Base64).
Pros:
Inconvénients:
Exemples:
Seule demande (multipart)
La demande contient une ou plusieurs parties à l'aide de métadonnées et de données.
Types de contenu:
Pros:
Inconvénients:
Exemples:
Seule demande (métadonnées de l'en-tête HTTP et URL)
Le corps de la requête contient les données et l'en-tête HTTP et l'URL contient les métadonnées.
Pros:
Inconvénients:
Deux demande
Une demande de métadonnées et d'une ou plusieurs demandes de données.
Pour:
Inconvénients:
Exemples:
Je ne peux pas penser à d'autres approches sur le dessus de ma tête.
De votre 3 approches, j'ai travaillé avec la méthode 3 le plus. La plus grande différence que je vois est entre la première méthode et les 2 autres: la Séparation des métadonnées et du contenu en 2 ressources
La première méthode semble la plus simple à coder. Cependant, je voudrais seulement aller avec la première méthode s'anticiper ce service étant rarement utilisé, et vous pouvez définir une limite raisonnable à l'utilisateur de téléchargement de fichiers.
Je crois que la méthode ultime est le numéro 3 (ressources naturelles) pour la raison principale qu'il permet de maximiser la valeur que je reçois de la HTTP standard, qui correspond à la façon dont je pense à des Api REST. Par exemple, en supposant un bien mis à la terre HTTP client est dans l'utilisation, vous obtenez les avantages suivants:
image/jpeg
ouimage/png
. Les en-têtes HTTP Accepter et Content-type nous donner une certaine élégance de la sémantique pour la négociation de ce entre les clients et les serveurs sans avoir à coder en dur tous dans le cadre de notre schéma et/ou de l'APID'autre part, je crois qu'il est juste de conclure que cette méthode n'est pas la plus simple si les données binaires en question n'est pas une option. Auquel cas les Inconvénients énumérés dans Eric Hu réponse entreront en jeu.