Hanya karena Anda tidak membungkus seluruh badan permintaan di JSON, tidak berarti tidak RESTful digunakan multipart/form-data
untuk memposting JSON dan file dalam satu permintaan:
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
di sisi server (menggunakan Python untuk pseudocode):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
untuk mengunggah banyak file, dimungkinkan untuk menggunakan "kolom formulir" yang terpisah untuk masing-masing:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... dalam hal ini kode server akan memiliki request.args['file1'][0]
danrequest.args['file2'][0]
atau menggunakan kembali yang sama untuk banyak orang:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... dalam hal request.args['files']
ini hanya akan menjadi daftar panjang 2.
atau melewati beberapa file melalui satu bidang:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
...dalam hal ini request.args['files']
akan menjadi string yang berisi semua file, yang Anda harus mengurai sendiri - tidak yakin bagaimana melakukannya, tapi saya yakin itu tidak sulit, atau lebih baik gunakan saja pendekatan sebelumnya.
Perbedaan antara @
dan <
adalah yang @
menyebabkan file untuk dilampirkan sebagai unggahan file, sedangkan <
melampirkan konten file sebagai bidang teks.
PS Hanya karena saya menggunakan curl
sebagai cara untuk menghasilkan POST
permintaan tidak berarti permintaan HTTP yang sama persis tidak dapat dikirim dari bahasa pemrograman seperti Python atau menggunakan alat yang cukup mampu.