Tôi nghĩ rằng bạn có thể sử dụng phương thức POST hoặc PATCH để xử lý việc này vì chúng thường thiết kế cho việc này.
Sử dụng một phương pháp POST
thường được sử dụng để thêm một phần tử khi sử dụng tài nguyên trên danh sách nhưng bạn cũng có thể hỗ trợ một vài hành động cho phương pháp này. Xem câu trả lời này: How to Update a REST Resource Collection. 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 đó, không cần phải xác định định dạng của bạn để mô tả bản cập nhật.
Sử dụng phương thức PATCH
cũng phù hợp vì yêu cầu tương ứng tương ứng với cập nhật một phần. 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 tính năng sửa đổi tài nguyên một phầ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 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ả cập nhật một phần.
Tôi nghĩ rằng trong trường hợp này, POST
và PATCH
khá tương tự kể từ khi bạn không thực sự cần để mô tả các hoạt động để làm cho mỗi phần tử. Tôi sẽ nói rằng nó phụ thuộc vào định dạng của biểu diễn để gửi.
Trường hợp PUT
ít rõ ràng hơn một chút. Trong thực tế, khi sử dụng phương thức 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 con đường tài nguyên cho danh sách doc
Trong trường hợp này, bạn cần phải explicitely cung cấp liên kết tài liệu với một chất kết dính trong các đại diện mà bạn cung cấp trong yêu cầu.
Đây là tuyến đường mẫu cho /docs
này.
Nội dung của phương pháp như vậy có thể cho 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 con đường nguồn phụ của nguyên tố kết dính
Ngoài ra bạn cũng có thể xem xét để tận dụng các tuyến đường phụ để mô tả liên kết giữa các tài liệu và các chất kết dính. Các gợi ý liên quan đến sự liên kết giữa một tài liệu và một chất kết dính không được xác định trong nội dung yêu cầu.
Đây là tuyến đường mẫu cho số /binder/{binderId}/docs
này. Trong trường hợp này, việc gửi danh sách tài liệu có phương thức POST
hoặc PATCH
sẽ đính kèm tài liệu vào bộ nhận dạng có mã định danh 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 phương pháp như vậy có thể cho 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 ứng, đó là tùy thuộc vào bạn để xác định mức độ phản ứng và các lỗi trở lại. Tôi thấy hai cấp độ: mức trạng thái (mức toàn cầu) và mức tải trọng (mức độ mỏng hơn). Nó cũng tùy thuộc vào bạn để xác định xem tất cả các chèn/cập nhật tương ứng với yêu cầu của bạn phải là nguyên tử hay không.
Trong trường hợp này, bạn có thể tận dụng các trạng thái HTTP. Nếu mọi thứ suôn sẻ, bạn sẽ nhận được 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 binder không hợp lệ) hoặc cái gì khác.
Trong trường hợp này, một tình trạng 200
sẽ được trả lại và nó tùy thuộc vào các đại diện phản ứng để mô tả những gì đã được thực hiện và nơi lỗi cuối cùng xảy ra. 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ể thực hiện một xử lý không đồng bộ để xử lý các 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 phải kéo thêm tài nguyên để xem điều gì 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 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ể xem cái này ;-)
Liên kết sau cũng có thể giúp bạn: https://templth.wordpress.com/2014/12/15/designing-a-web-api/.
Hy vọng nó giúp bạn, Thierry
Đôi khi khách hàng cần hoạt động hàng loạt và không muốn quan tâm liệu tài nguyên có ở đó hay không. Như tôi đã nói trong câu hỏi, khách hàng muốn gửi một loạt các "tài liệu" và liên kết chúng với 'binders'. Khách hàng muốn tạo các liên kết nếu họ không tồn tại và tạo liên kết nếu họ làm. Trong MỘT yêu cầu BULK SINGLE. – norbertpy