JSON'da tüm istek gövdesini sarmamanız, multipart/form-data
hem 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 curl
oluşturmak için bir yol olarak kullanıyorum , POST
aynı HTTP isteklerinin Python gibi bir programlama dilinden veya yeterince yetenekli bir araç kullanılarak gönderilemeyeceği anlamına gelmez.