То, что вы не заключаете тело запроса в JSON, вовсе не означает, что использовать REST multipart/form-data
для размещения как JSON, так и файлов в одном запросе не рекомендуется:
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
запросов, не означает, что те же самые HTTP-запросы не могут быть отправлены с языка программирования, такого как Python, или с использованием достаточно мощного инструмента.