Solo perché non stai racchiudendo l'intero corpo della richiesta in JSON, non significa che non sia RESTful utilizzare multipart/form-data
per pubblicare sia il file JSON che i file in una singola richiesta:
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
sul lato server (usando Python per lo pseudocodice):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
per caricare più file, è possibile utilizzare "campi modulo" separati per ciascuno:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... nel qual caso il codice del server avrà request.args['file1'][0]
erequest.args['file2'][0]
o riutilizzare lo stesso per molti:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... nel qual caso request.args['files']
sarà semplicemente un elenco di lunghezza 2.
o passa più file attraverso un singolo campo:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
... nel qual caso request.args['files']
sarà una stringa contenente tutti i file, che dovrai analizzare tu stesso - non sei sicuro di come farlo, ma sono sicuro che non è difficile, o meglio usa semplicemente gli approcci precedenti.
La differenza tra @
e <
è che @
fa sì che il file venga allegato come caricamento del file, mentre <
allega il contenuto del file come campo di testo.
PS Solo perché sto usando curl
un modo per generare le POST
richieste non significa che le stesse richieste HTTP esatte non possano essere inviate da un linguaggio di programmazione come Python o usando uno strumento sufficientemente capace.