2013-05-30 32 views
5

Tôi đang xây dựng một dự án quanh API của riêng mình và mọi thứ hoạt động tốt cho đến nay, nhưng tôi muốn giới thiệu các hành động của UNDO cho DELETE.Làm cách nào để hoàn tác hành động DELETE và tuân thủ các tiêu chuẩn RESTful?

Cho đến nay, DELETE hoạt động theo cách đó:

DELETE/danh bạ /: id

ban đầu của tôi dù cho UNDO là để gọi cùng DELETE trên url cùng, trong đó sẽ hủy bỏ tình trạng bị xóa (nếu liên hệ này ở trạng thái đã xóa), nhưng tôi không có ý tưởng gì nếu đây là một cách hay hay không.

Tôi đọc this post trông giống như vậy, nhưng phần "thanh toán" cung cấp câu trả lời cho nội dung khác từ những gì tôi đang tìm kiếm.

Đề xuất của tôi tốt hay có cách nào tốt hơn không?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

5

Nếu bạn đã xóa tài nguyên bằng cách sử dụng DELETE yêu cầu tiếp theo đối với tài nguyên phải trả về 404 NOT FOUND hoặc 410 GONEkhông còn tài nguyên ở đó để chấp nhận yêu cầu.

Nếu được chấp nhận và bạn có trạng thái sẵn có, câu trả lời đơn giản nhất là chỉ cần tạo lại tài nguyên bằng cách phát hành PUT tại URL của tài nguyên đã bị xóa. Về mặt ngữ nghĩa, điều này tạo ra một tài nguyên mới, thay thế bất kỳ trạng thái hiện có nào, không thực sự hoàn tác việc xóa.

Một giải pháp đơn giản khác là thừa nhận rằng bạn không thực sự xóa tài nguyên và chỉ thay đổi trạng thái của chúng theo cách nào đó để hiển thị chúng được lưu trữ. Điều đó có nghĩa là bạn không thể sử dụng động từ DELETE nhưng bạn có thể phát ra yêu cầu PUT hoặc POST để thay đổi giữa các trạng thái được lưu trữ và hoạt động.

Nếu bạn muốn giữ DELETE như phương tiện của bạn loại bỏ các hồ sơ, sau đó là một lựa chọn là để làm cho nó có thể truy cập vào một tài nguyên lưu trữ bằng cách sử dụng một show-archived giá trị đặc biệt:

GET /contacts/<id>?show-archived=true 

Xác định này trên một tài nguyên được lưu trữ sẽ trả về một 200 trên tài nguyên được lưu trữ thay vì một trong các mã 40X. Đó là một chút may mắn, bởi vì tài nguyên của bạn bây giờ có một vấn đề "superstate" xuất hiện cả hai để tồn tại và không tồn tại tùy thuộc vào cách bạn quan sát chúng. Tuy nhiên, điều đó có nghĩa là bạn có thể yêu cầu tài nguyên cập nhật trạng thái của nó:

PUT /contacts/<id>?show-archived=true 

State=Active 
... all other unchanged fields ... 
+1

+1 - một biến thể nhỏ khác là PATCH vì bạn chỉ cập nhật một phần tài nguyên (trong trường hợp này, trạng thái đã xóa/lưu trữ) – bryanmac

+0

'PATCH' rất phù hợp với loại yêu cầu này, tuy nhiên hỗ trợ cho nó thay đổi; nó khá mới đối với gia đình động từ HTTP. –

1

Cá nhân tôi sẽ làm cho UNDO DELETE một PUT đối với tài nguyên nếu deletion state là một phần của các đại diện, hoặc một POST trên một action nếu không muốn nói.

Đó action sẽ trông như thế:

POST /contact/id/action/[recover|reactivate] (or whatever you think is more descriptive for the action). 

Nhưng điều này chỉ là cách tôi nghĩ là hầu hết RESTFul tuân thủ.

+0

Rõ ràng, nó không phải là tiêu chuẩn RESTFul để sử dụng động từ trong url.Động từ chỉ được trình bày theo phương pháp –

+0

nhờ nhận xét của bạn – ssedano

Các vấn đề liên quan