Ce n'est pas parce que le corps entier de la requête n'est pas enveloppé dans du JSON que l'utilisation de RESTful n'est pas possible. multipart/form-data
pour envoyer à la fois le JSON et le(s) fichier(s) en une seule requête :
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
du côté du serveur :
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
pour télécharger plusieurs fichiers, il est possible d'utiliser des "champs de formulaire" distincts pour chacun d'eux :
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
...dans ce cas le code du serveur aura request.args['file1'][0]
et request.args['file2'][0]
ou réutiliser le même pour plusieurs :
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
...dans ce cas request.args['files']
sera simplement une liste de longueur 2.
ou faire passer plusieurs fichiers par un seul champ :
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
...dans ce cas request.args['files']
sera une chaîne contenant tous les fichiers, que vous devrez analyser vous-même - je ne sais pas comment faire, mais je suis sûr que ce n'est pas difficile, ou mieux encore, utilisez les approches précédentes.
La différence entre @
et <
c'est que @
fait en sorte que le fichier soit joint en tant que fichier téléchargé, alors que <
joint le contenu du fichier comme un champ de texte.
P.S. Ce n'est pas parce que j'utilise curl
comme moyen de générer le POST
ne signifie pas que les mêmes requêtes HTTP ne pourraient pas être envoyées à partir d'un langage de programmation tel que Python ou à l'aide de tout autre outil suffisamment performant.
45 votes
Il n'est pas vraiment nécessaire de s'en tenir à l'utilisation de JSON pour disposer d'un service web RESTful. REST est en fait tout ce qui suit les grands principes des méthodes HTTP et quelques autres règles (sans doute non standardisées).