Đó là một yêu cầu khá phổ biến để hỗ trợ xóa hoặc xóa trễ/theo đợt cho các dịch vụ dữ liệu. Những gì tôi đang tự hỏi là làm thế nào để thực hiện điều này một cách RESTful. Tôi bị giằng xé giữa một vài lựa chọn khác nhau (không ai trong số đó có vẻ hấp dẫn khủng khiếp với tôi). Phổ biến trên các tùy chọn khác nhau này, tôi tin rằng, là sự cần thiết cho một API trả về tất cả các tài nguyên được đánh dấu là đã xóa cho một loại tài nguyên cụ thể.RESTful undelete
Dưới đây là một số tùy chọn Tôi đã nghĩ về và một số ưu của họ/nhược điểm:
Tùy chọn để đánh dấu tài nguyên như xóa:
- Sử dụng HTTP DELETE để đánh dấu các tài nguyên như bị xóa.
- Sử dụng HTTP PUT/POST để cập nhật cờ đã xóa. Điều này không cảm thấy đúng vì nó ánh xạ những gì cơ bản là một xóa khỏi phương thức HTTP DELETE và các phương thức HTTP khác.
Tùy chọn khi nguồn GET-ing đánh dấu để xóa:
- Return HTTP Status 404 cho một nguồn tài nguyên được đánh dấu là bị xóa. Làm sạch & trong suốt, nhưng làm cách nào để chúng tôi biết sự khác biệt giữa tài nguyên thực sự bị xóa so với tài nguyên chỉ được đánh dấu là đã xóa.
- Trạng thái HTTP trả lại 410. Cung cấp cách để cho biết sự khác biệt, nhưng 410 kỹ thuật nói rằng "được dự kiến sẽ được coi là vĩnh viễn. Khách hàng có khả năng chỉnh sửa liên kết NÊN xóa tham chiếu đến URI yêu cầu sau khi người dùng chấp thuận". Có thể có đủ chỗ trống trong các từ "mong đợi" và "NÊN" ở đây. Không chắc là 410 được hỗ trợ/hiểu rõ như thế nào ở các khách hàng.
- Trả lại trạng thái HTTP 200 và bao gồm trường cờ chỉ ra tài nguyên bị xóa. Điều này có vẻ kinh khủng vì ý tưởng xóa nó ngay từ đầu là bởi vì bạn thực sự muốn nó không xuất hiện. Điều này thúc đẩy trách nhiệm lọc ra các tài nguyên đã bị xóa cho khách hàng.
Tùy chọn cho câu trả lời trong đó bao gồm khu vực này đã bị xóa:
- Bỏ qua nguồn makred như bị xóa. Làm sạch & đơn giản. Nhưng nếu bạn thực sự muốn biết về các tài nguyên đã bị xóa.
- Bao gồm chúng cùng với trường cho biết chúng đã bị xóa. Điều này thúc đẩy trách nhiệm lọc ra các tài nguyên đã bị xóa cho khách hàng. Nó làm cho việc phân trang trở nên phức tạp nếu bạn chỉ muốn trang thông qua các tài nguyên đang hoạt động hoặc bị xóa.
Tùy chọn khi cập nhật một nguồn tài nguyên đánh dấu để xóa:
- Sử dụng Status HTTP 404. Các nguồn tài nguyên đã biến mất phải không? Tuy nhiên, làm thế nào bạn có thể cho biết sự khác biệt giữa một tài nguyên được đánh dấu là đã xóa và một thực sự bị xóa. Cơ thể HTTP trong phản hồi 404 có thể phân biệt ở đây nhưng sau đó các khách hàng được để lại phân tích cú pháp/giải thích cho cơ thể của bạn phân biệt. Có thể tiêu đề phản hồi có thể trợ giúp ở đây? Cái nào? Tiêu đề tùy chỉnh?
- Sử dụng Trạng thái HTTP 409 với thông báo về cách tài nguyên trước tiên phải được hủy xóa.
Tùy chọn để lấy lại tài nguyên đánh dấu để xóa:
- Sử dụng HTTP PUT/POST để cập nhật hoạt động của tài nguyên và đánh dấu nó như là hoạt động trở lại. Điều này chỉ hoạt động miễn là bạn không trả lại một HTTP 404 cho hoạt động GET cho tài nguyên vì nó không thực hiện kể từ PUT/POST đến một tài nguyên "Không tìm thấy" (404).
- Sử dụng HTTP PUT/POST để tạo hoạt động của tài nguyên. Vấn đề ở đây là dữ liệu nào được ưu tiên? Dữ liệu được gửi trong hoạt động tạo? Hoặc dữ liệu đang được hủy xóa? lọc nó ra khỏi bất kỳ truy vấn nào khác có thể đã trả về nó. Sau đó, xử lý HTTP PUT/POST để tạo tài nguyên dưới dạng hồi phục nếu mã định danh tài nguyên trỏ đến tài nguyên được đánh dấu là đã xóa.
- Đường dẫn REST riêng biệt dành riêng cho phục hồi tài nguyên được đánh dấu để xóa.
Đây không phải là danh sách đầy đủ. Tôi chỉ muốn liệt kê một số tùy chọn đã nảy ra trong đầu tôi.
Tôi biết câu trả lời cho cách thực hiện điều này, như thường lệ, "nó phụ thuộc". Điều tôi tò mò là bạn sẽ sử dụng trình độ/yêu cầu nào để đưa ra quyết định? Làm thế nào bạn đã thấy điều này được thực hiện hoặc thực hiện nó cho mình?
Đây là một trong những câu hỏi được chuẩn bị tốt nhất và được suy nghĩ cẩn thận mà tôi từng thấy trên StackOverflow. Có một upvote. –