リクエストの本文全体をJSONでラップしていないmultipart/form-data
からといって、JSONとファイルの両方を1つのリクエストに投稿するのにRESTfulではないという意味ではありません。
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
サーバー側(Pythonを擬似コードに使用):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
複数のファイルをアップロードするには、それぞれに個別の「フォームフィールド」を使用することができます。
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
...その場合には、サーバーのコードがありますrequest.args['file1'][0]
し、request.args['file2'][0]
または同じものを多くの人に再利用します:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
...この場合request.args['files']
、長さ2のリストになります。
または、単一のフィールドを介して複数のファイルを渡します。
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
...この場合request.args['files']
、すべてのファイルを含む文字列となり、自分で解析する必要があります。その方法はわかりませんが、難しくはないか、以前の方法を使用する方がよいと思います。
違い@
とは<
つまり@
一方、ファイルアップロードとして執着するファイルの原因となる<
テキストフィールドとしてアタッチファイルの内容。
PS要求curl
を生成する方法として使用しているからとPOST
いって、Pythonなどのプログラミング言語から、または十分に機能するツールを使用して、まったく同じHTTP要求を送信できなかったわけではありません。