Chỉ vì bạn không gói toàn bộ cơ thể yêu cầu trong JSON, không có nghĩa là nó không phải RESTful sử dụng multipart/form-data
để gửi cả JSON và tập tin (hoặc nhiều file) trong một yêu cầu duy nhất:
curl -F "metadata=<metadata.json" -F "[email protected]" http://example.com/add-file
ở phía máy chủ (sử dụng Python là ngôn ngữ lập trình ở đây):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
tải lên mu file ltiple, nó có thể hoặc là sử dụng "cánh đồng mẫu" riêng biệt cho mỗi:
curl -F "metadata=<metadata.json" -F "[email protected]" -F "[email protected]" http://example.com/add-file
... trong trường hợp này mã máy chủ sẽ có request.args['file1'][0]
và request.args['file2'][0]
hay tái sử dụng cùng một cho nhiều :
curl -F "metadata=<metadata.json" -F "[email protected]" -F "[email protected]" http://example.com/add-file
... trong trường hợp này request.args['files']
sẽ chỉ đơn giản là một danh sách dài 2.
hay thực sự vượt qua nhiều file vào một trường duy nhất trong một đi:
curl -F "metadata=<metadata.json" -F "[email protected],some-other-file.tar.gz" http://example.com/add-file
... trong trường hợp này request.args['files']
sẽ là một chuỗi có chứa tất cả các file mà bạn sẽ phải phân tích chính mình - không chắc chắn làm thế nào để làm điều đó, nhưng tôi chắc chắn nó không phải là khó khăn, hoặc tốt hơn chỉ cần sử dụng các phương pháp tiếp cận trước đó.
Sự khác biệt giữa @
và <
là @
làm cho tệp được đính kèm dưới dạng tệp tải lên, trong khi <
đính kèm nội dung của tệp dưới dạng trường văn bản.
P.S. Chỉ vì tôi đang sử dụng curl
như một cách để tạo yêu cầu POST
không có nghĩa là yêu cầu HTTP chính xác không thể gửi từ ngôn ngữ lập trình như Python hoặc sử dụng bất kỳ công cụ đủ khả năng nào.
Gắn bó với chỉ sử dụng JSON là không thực sự cần thiết để có một trang web RESTful dịch vụ. Về cơ bản, REST là bất cứ thứ gì tuân theo các nguyên tắc chính của các phương thức HTTP và một số quy tắc khác (được cho là không được chuẩn hóa). –