JSON'da tüm istek gövdesini sarmamanız, multipart/form-datahem JSON'u hem de dosyaları tek bir istekte yayınlamanın RESTful olmadığı anlamına gelmez :
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
sunucu tarafında (sözde kod için Python kullanarak):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
birden fazla dosya yüklemek için her biri için ayrı "form alanları" kullanmak mümkündür:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... bu durumda sunucu kodu request.args['file1'][0]verequest.args['file2'][0]
veya birçoğunu aynı şekilde tekrar kullanın:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... bu durumda request.args['files']uzunluk 2'nin bir listesi olacaktır.
veya tek bir alandan birden fazla dosya geçirin:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
... bu durumda request.args['files'], tüm dosyaları içeren bir dize olacak, kendinizi ayrıştırmanız gerekecek - nasıl yapılacağından emin değilim, ama zor olmadığından emin değilim ya da sadece önceki yaklaşımları kullanın.
Arasındaki fark @ve <yani @, oysa dosya dosya yüklemesinden olarak bağlanmaması gerektiğini nedenleri <bir metin alanı olarak dosyanın Ataşe içeriği.
PS Sadece istekleri curloluşturmak için bir yol olarak kullanıyorum , POSTaynı HTTP isteklerinin Python gibi bir programlama dilinden veya yeterince yetenekli bir araç kullanılarak gönderilemeyeceği anlamına gelmez.