Các R trong REST là viết tắt của tài nguyên
(Điều đó không đúng, vì nó là viết tắt của Đại diện, nhưng đó là một mẹo hay để ghi nhớ tầm quan trọng của Tài nguyên trong REST).
Giới thiệu PUT /groups/api/v1/groups/{group id}/status/activate
: bạn không cập nhật "kích hoạt". "Kích hoạt" không phải là một thứ, nó là một động từ. Động từ không bao giờ là tài nguyên tốt. Một nguyên tắc nhỏ: nếu hành động, một động từ, nằm trong URL, thì có lẽ nó không phải là RESTful .
Bạn đang làm gì thay thế? Hoặc bạn đang "thêm", "xóa" hoặc "cập nhật" kích hoạt trên Nhóm hoặc nếu bạn muốn: thao tác với "trạng thái" - cung cấp nguồn trên Nhóm. Cá nhân, tôi sử dụng "kích hoạt" vì chúng ít mơ hồ hơn khái niệm "trạng thái": tạo trạng thái không rõ ràng, tạo kích hoạt thì không.
POST /groups/{group id}/activation
Tạo (hoặc yêu cầu tạo) một kích hoạt.
PATCH /groups/{group id}/activation
Cập nhật một số chi tiết của một kích hoạt hiện có. Vì một nhóm chỉ có một kích hoạt, chúng tôi biết tài nguyên kích hoạt nào chúng tôi đang đề cập đến.
PUT /groups/{group id}/activation
Chèn hoặc thay thế kích hoạt cũ. Vì một nhóm chỉ có một kích hoạt, chúng tôi biết tài nguyên kích hoạt nào chúng tôi đang đề cập đến.
DELETE /groups/{group id}/activation
Sẽ hủy hoặc xóa kích hoạt.
Mẫu này hữu ích khi "kích hoạt" của Nhóm có tác dụng phụ, chẳng hạn như thanh toán được thực hiện, thư được gửi, v.v. Chỉ POST và PATCH có thể có tác dụng phụ như vậy. Khi ví dụ xóa một kích hoạt cần phải nói, thông báo cho người dùng qua thư, XÓA không phải là lựa chọn đúng đắn; trong trường hợp đó, bạn có thể muốn tạo tài nguyên hủy kích hoạt : POST /groups/{group_id}/deactivation
.
Bạn nên tuân theo các hướng dẫn này, vì hợp đồng tiêu chuẩn này cho thấy rõ ràng cho khách hàng của bạn và tất cả các proxy và lớp giữa khách hàng và bạn, biết khi nào an toàn để thử lại và khi nào không. Giả sử máy khách đang ở một nơi nào đó có wifi không ổn định và người dùng của nó nhấp vào "hủy kích hoạt", điều này sẽ kích hoạt DELETE
: Nếu thất bại, khách hàng có thể thử lại, cho đến khi nhận được 404, 200 hoặc bất cứ điều gì khác mà nó có thể xử lý. Nhưng nếu nó kích hoạt POST to deactivation
thì nó biết không thử lại: POST ngụ ý điều này.
Bất kỳ khách hàng nào hiện có hợp đồng, khi được theo dõi sẽ bảo vệ khỏi việc gửi 42 email "nhóm của bạn đã bị hủy kích hoạt", đơn giản vì thư viện HTTP của nó tiếp tục thử lại cuộc gọi đến phụ trợ.
Cập nhật một thuộc tính duy nhất: sử dụng VÒI
PATCH /groups/{group id}
Trong trường hợp bạn muốn cập nhật một thuộc tính. Ví dụ: "trạng thái" có thể là một thuộc tính trên Nhóm có thể được đặt. Một thuộc tính như "trạng thái" thường là một ứng cử viên tốt để giới hạn trong danh sách trắng các giá trị. Các ví dụ sử dụng một số lược đồ JSON không xác định:
PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK
PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable
Thay thế tài nguyên, không có tác dụng phụ sử dụng PUT.
PUT /groups/{group id}
Trong trường hợp bạn muốn thay thế toàn bộ Nhóm. Điều này không nhất thiết có nghĩa là máy chủ thực sự tạo ra một nhóm mới và ném nhóm cũ ra ngoài, ví dụ: các id có thể vẫn giữ nguyên. Nhưng đối với các khách hàng, đây là những gì PUT có thể có nghĩa là: khách hàng nên cho anh nhận được một mục hoàn toàn mới, dựa trên phản ứng của máy chủ.
Trong trường hợp PUT
yêu cầu, khách hàng phải luôn gửi toàn bộ tài nguyên, có tất cả dữ liệu cần thiết để tạo một mục mới: thường là cùng một dữ liệu mà POST-tạo sẽ yêu cầu.
PUT /groups/{group id} { "attributes": { "status": "active" } }
response: 406 Not Acceptable
PUT /groups/{group id} { "attributes": { "name": .... etc. "status": "active" } }
response: 201 Created or 200 OK, depending on whether we made a new one.
Một yêu cầu rất quan trọng là đó PUT
là idempotent: nếu bạn yêu cầu tác dụng phụ khi cập nhật Nhóm (hoặc thay đổi kích hoạt), bạn nên sử dụng PATCH
. Vì vậy, khi cập nhật kết quả, ví dụ như gửi thư, không sử dụng PUT
.