Tôi nghĩ rằng bạn có thể sử dụng phương thức POST hoặc PATCH để xử lý điều này vì chúng thường thiết kế cho điều này.
Sử dụng một POST
phương thức thường được sử dụng để thêm một phần tử khi được sử dụng trên tài nguyên danh sách nhưng bạn cũng có thể hỗ trợ một số hành động cho phương thức này. Xem câu trả lời này: Cách Cập nhật Bộ sưu tập Tài nguyên REST . Bạn cũng có thể hỗ trợ các định dạng biểu diễn khác nhau cho đầu vào (nếu chúng tương ứng với một mảng hoặc một phần tử đơn lẻ).
Trong trường hợp này, không cần thiết phải xác định định dạng của bạn để mô tả bản cập nhật.
Sử dụng một PATCH
phương thức cũng phù hợp vì các yêu cầu tương ứng tương ứng với một bản cập nhật. Theo RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
Một số ứng dụng mở rộng Giao thức truyền siêu văn bản (HTTP) yêu cầu một tính năng để thực hiện sửa đổi một phần tài nguyên. Phương thức HTTP PUT hiện tại chỉ cho phép thay thế hoàn toàn một tài liệu. Đề xuất này thêm một phương thức HTTP mới, PATCH, để sửa đổi tài nguyên HTTP hiện có.
Trong trường hợp này, bạn phải xác định định dạng của mình để mô tả bản cập nhật từng phần.
Tôi nghĩ rằng trong trường hợp này, POST
và PATCH
khá giống nhau vì bạn không thực sự cần phải mô tả hoạt động cần làm cho từng phần tử. Tôi muốn nói rằng nó phụ thuộc vào định dạng của đại diện để gửi.
Trường hợp của PUT
là một chút ít rõ ràng hơn. Trên thực tế, khi sử dụng một phương pháp PUT
, bạn nên cung cấp toàn bộ danh sách. Trên thực tế, đại diện được cung cấp trong yêu cầu sẽ thay thế cho tài nguyên danh sách.
Bạn có thể có hai tùy chọn liên quan đến đường dẫn tài nguyên.
- Sử dụng đường dẫn tài nguyên cho danh sách tài liệu
Trong trường hợp này, bạn cần cung cấp rõ ràng liên kết của các tài liệu với chất kết dính trong phần trình bày mà bạn cung cấp trong yêu cầu.
Đây là một tuyến đường mẫu cho việc này /docs
.
Nội dung của cách tiếp cận như vậy có thể là phương pháp POST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Sử dụng đường dẫn tài nguyên phụ của phần tử chất kết dính
Ngoài ra, bạn cũng có thể xem xét sử dụng các tuyến con để mô tả mối liên kết giữa tài liệu và chất kết dính. Các gợi ý về mối liên kết giữa tài liệu và chất kết dính bây giờ không cần phải được chỉ định trong nội dung yêu cầu.
Đây là một tuyến đường mẫu cho việc này /binder/{binderId}/docs
. Trong trường hợp này, gửi danh sách tài liệu có một phương thức POST
hoặc PATCH
sẽ đính kèm tài liệu vào trình kết dính với số nhận dạng binderId
sau khi tạo tài liệu nếu tài liệu đó không tồn tại.
Nội dung của cách tiếp cận như vậy có thể là phương pháp POST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
Về phản hồi, tùy thuộc vào bạn để xác định mức độ phản hồi và các lỗi cần trả lại. Tôi thấy hai cấp độ: cấp độ trạng thái (cấp độ toàn cầu) và cấp độ tải trọng (cấp độ mỏng hơn). Bạn cũng phải xác định xem tất cả các phần chèn / cập nhật tương ứng với yêu cầu của bạn có phải là nguyên tử hay không.
Trong trường hợp này, bạn có thể tận dụng trạng thái HTTP. Nếu mọi thứ suôn sẻ, bạn sẽ có được một trạng thái 200
. Nếu không, một trạng thái khác như 400
nếu dữ liệu được cung cấp không chính xác (ví dụ: id liên kết không hợp lệ) hoặc một cái gì đó khác.
Trong trường hợp này, một trạng thái 200
sẽ được trả lại và tùy thuộc vào biểu diễn phản hồi để mô tả những gì đã được thực hiện và cuối cùng lỗi xảy ra ở đâu. ElasticSearch có một điểm cuối trong API REST của nó để cập nhật hàng loạt. Điều này có thể cung cấp cho bạn một số ý tưởng ở cấp độ này: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Bạn cũng có thể triển khai xử lý không đồng bộ để xử lý dữ liệu được cung cấp. Trong trường hợp này, trả về trạng thái HTTP sẽ là 202
. Khách hàng cần kéo thêm một nguồn để xem điều gì sẽ xảy ra.
Trước khi kết thúc, tôi cũng muốn lưu ý rằng đặc tả OData giải quyết vấn đề liên quan đến mối quan hệ giữa các thực thể với tính năng có tên liên kết điều hướng . Có lẽ bạn có thể nhìn vào cái này ;-)
Liên kết sau cũng có thể giúp bạn: https://templth.wordpress.com/2014/12/15/designs-a-web-api/ .
Hy vọng nó sẽ giúp bạn, Thierry
GET /docs
và truy xuất tất cả tài liệu trong một chất kết dính cụ thể ,GET /docs?binder_id=x
. Để xóa một tập hợp con của các tài nguyên, tôi sẽ gọiDELETE /docs?binder_id=x
hay tôi nên gọiDELETE /docs
với một{"binder_id": x}
trong phần thân yêu cầu? Bạn có bao giờ sử dụngPATCH /docs?binder_id=x
để cập nhật hàng loạt hay chỉPATCH /docs
và vượt qua các cặp không?