Nur weil Sie nicht den gesamten Anforderungshauptteil in JSON einschließen, bedeutet dies nicht, dass es nicht RESTful ist, multipart/form-data
sowohl JSON als auch die Datei (en) in einer einzigen Anforderung zu veröffentlichen:
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
auf der Serverseite (mit Python als Pseudocode):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
Um mehrere Dateien hochzuladen, können Sie entweder separate "Formularfelder" für jedes verwenden:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... in diesem Fall hat der Servercode request.args['file1'][0]
undrequest.args['file2'][0]
oder verwenden Sie das gleiche für viele:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... in diesem Fall request.args['files']
wird einfach eine Liste der Länge 2 sein.
oder übergeben Sie mehrere Dateien durch ein einzelnes Feld:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
... in diesem Fall request.args['files']
wird es eine Zeichenfolge sein, die alle Dateien enthält, die Sie selbst analysieren müssen - nicht sicher, wie es geht, aber ich bin sicher, dass es nicht schwierig ist, oder besser nur die vorherigen Ansätze verwenden.
Der Unterschied zwischen @
und <
besteht darin, @
dass die Datei als Datei-Upload angehängt wird, während <
der Inhalt der Datei als Textfeld angehängt wird .
PS Nur weil ich curl
die POST
Anforderungen generiere , heißt das nicht, dass nicht genau dieselben HTTP-Anforderungen von einer Programmiersprache wie Python oder einem ausreichend leistungsfähigen Tool gesendet werden konnten.