リクエストの本文全体を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要求を送信できなかったわけではありません。