Ce n'est pas parce que vous n'encapsulez pas tout le corps de la demande dans JSON que cela n'est pas RESTful à utiliser multipart/form-data
pour publier à la fois le JSON et les fichiers dans une seule demande:
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
côté serveur (en utilisant Python pour le pseudocode):
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 soit des "champs de formulaire" séparés pour chacun:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... auquel cas le code du serveur aura request.args['file1'][0]
etrequest.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
... auquel cas request.args['files']
sera simplement une liste de longueur 2.
ou passez plusieurs fichiers dans un seul champ:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
... auquel cas request.args['files']
sera une chaîne contenant tous les fichiers, que vous devrez analyser vous-même - je ne sais pas comment le faire, mais je suis sûr que ce n'est pas difficile, ou mieux utilisez simplement les approches précédentes.
La différence entre @
et <
est que @
le fichier est joint en tant que téléchargement de fichier, tandis que <
le contenu du fichier est joint en tant que champ de texte.
PS Ce n'est pas parce que j'utilise curl
comme moyen de générer des POST
requêtes que les mêmes requêtes HTTP ne peuvent pas être envoyées à partir d'un langage de programmation tel que Python ou en utilisant un outil suffisamment performant.