Nur weil Sie nicht den gesamten Anforderungshauptteil in JSON einschließen, bedeutet dies nicht, dass es nicht RESTful ist, multipart/form-datasowohl 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 curldie POSTAnforderungen 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.