Тільки тому, що ви не загортаєте все тіло запиту в JSON, це не означає, що його НЕ РЕЗУЛЬТАТИ використовувати 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, або з використанням будь-якого достатньо спроможного інструменту.