Ce sera probablement une question stupide, mais je passe une de ces nuits. Dans une application, je développe l'API RESTful et nous voulons que le client envoie des données au format JSON. Une partie de cette application nécessite que le client télécharge un fichier (généralement une image) ainsi que des informations sur l'image.
J'ai du mal à retracer comment cela se produit dans une seule demande. Est-il possible de Base64 les données du fichier dans une chaîne JSON? Vais-je devoir effectuer 2 publications sur le serveur? Ne devrais-je pas utiliser JSON pour cela?
En remarque, nous utilisons Grails sur le backend et ces services sont accessibles par les clients mobiles natifs (iPhone, Android, etc.), si cela fait une différence.
json
rest
grails
file-upload
Gregg
la source
la source
Réponses:
J'ai posé une question similaire ici:
Comment télécharger un fichier avec des métadonnées à l'aide d'un service Web REST?
Vous avez essentiellement trois choix:
multipart/form-data
POST et renvoyez un ID au client. Le client envoie ensuite les métadonnées avec l'ID et le serveur réassocie le fichier et les métadonnées.la source
Vous pouvez envoyer le fichier et les données en une seule demande en utilisant le type de contenu multipart / form-data :
Sur http://www.faqs.org/rfcs/rfc2388.html :
Vous pouvez inclure des informations de fichier ou des informations de champ dans chaque section entre les limites. J'ai réussi à implémenter un service RESTful qui obligeait l'utilisateur à soumettre à la fois des données et un formulaire, et les données en plusieurs parties / formulaires fonctionnaient parfaitement. Le service a été construit en utilisant Java / Spring, et le client utilisait C #, donc malheureusement je n'ai pas d'exemples Grails à vous donner sur la façon de configurer le service. Vous n'avez pas besoin d'utiliser JSON dans ce cas car chaque section "form-data" vous fournit un endroit pour spécifier le nom du paramètre et sa valeur.
La bonne chose à propos de l'utilisation de multipart / form-data est que vous utilisez des en-têtes définis par HTTP, donc vous vous en tenez à la philosophie REST d'utiliser les outils HTTP existants pour créer votre service.
la source
Je sais que ce fil est assez ancien, cependant, il me manque ici une option. Si vous avez des métadonnées (dans n'importe quel format) que vous souhaitez envoyer avec les données à télécharger, vous pouvez faire une seule
multipart/related
demande.Vous pouvez vérifier la spécification RFC 2387 pour plus de détails.
Fondamentalement, chaque partie d'une telle demande peut avoir un contenu de type différent et toutes les parties sont en quelque sorte liées (par exemple une image et ses métadonnées). Les pièces sont identifiées par une chaîne de délimitation et la chaîne de délimitation finale est suivie de deux tirets.
Exemple:
la source
Je sais que cette question est ancienne, mais au cours des derniers jours, j'avais cherché sur tout le Web pour résoudre cette même question. J'ai des services Web REST Grails et un client iPhone qui envoient des photos, un titre et une description.
Je ne sais pas si mon approche est la meilleure, mais elle est si facile et simple.
Je prends une photo en utilisant le UIImagePickerController et envoie au serveur le NSData en utilisant les balises d'en-tête de demande pour envoyer les données de la photo.
Côté serveur, je reçois la photo en utilisant le code:
Je ne sais pas si j'ai des problèmes à l'avenir, mais maintenant, ça fonctionne bien dans l'environnement de production.
la source
Voici mon approche API (j'utilise un exemple) - comme vous pouvez le voir, vous je n'utilise aucun
file_id
(identifiant de fichier téléchargé sur le serveur) dans l'API:Créer un
photo
objet sur le serveur:Téléchargez le fichier (notez qu'il
file
est au singulier car il n'est qu'un par photo):Et puis par exemple:
Lire la liste des photos
Lire les détails de la photo
Lire le fichier photo
Donc, la conclusion est que, d'abord, vous créez un objet (photo) par POST, puis vous envoyez une deuxième demande avec le fichier (à nouveau POST).
la source
Objets FormData: télécharger des fichiers à l'aide d'Ajax
XMLHttpRequest Level 2 ajoute la prise en charge de la nouvelle interface FormData. Les objets FormData fournissent un moyen de construire facilement un ensemble de paires clé / valeur représentant des champs de formulaire et leurs valeurs, qui peuvent ensuite être facilement envoyés à l'aide de la méthode XMLHttpRequest send ().
https://developer.mozilla.org/en-US/docs/Web/API/FormData
la source
Étant donné que le seul exemple manquant est l' exemple ANDROID , je vais l'ajouter. Cette technique utilise une AsyncTask personnalisée qui doit être déclarée dans votre classe Activity.
Ainsi, lorsque vous souhaitez télécharger votre fichier, appelez simplement:
la source
Je voulais envoyer des chaînes au serveur principal. Je n'ai pas utilisé json avec plusieurs parties, j'ai utilisé des paramètres de demande.
L'URL ressemblerait
Je passe deux paramètres (uuid et type) avec le téléchargement de fichiers. J'espère que cela aidera ceux qui n'ont pas les données json complexes à envoyer.
la source
Vous pouvez essayer d'utiliser la bibliothèque https://square.github.io/okhttp/ . Vous pouvez définir le corps de la requête sur plusieurs parties, puis ajouter séparément le fichier et les objets json comme suit:
la source
la source
Veuillez vous assurer que vous disposez de l'importation suivante. Bien sûr, d'autres importations standard
la source
java.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String