Mặc dù thông số kỹ thuật HTTP 1.1 dường như cho phép các nội dung thông báo trên các yêu cầu DELETE , nó dường như chỉ ra rằng các máy chủ nên bỏ qua nó vì không có ngữ nghĩa xác định cho nó.
4.3 Nội dung thư
Máy chủ NÊN đọc và chuyển tiếp nội dung thư theo bất kỳ yêu cầu nào; nếu phương thức yêu cầu không bao gồm ngữ nghĩa đã xác định cho phần thân thực thể, thì phần thân thông báo NÊN bị bỏ qua khi xử lý yêu cầu.
Tôi đã xem xét một số cuộc thảo luận liên quan về chủ đề này trên SO và hơn thế nữa, chẳng hạn như:
- Một cơ quan thực thể có được phép cho một yêu cầu HTTP DELETE không?
- Tải trọng của các phương thức yêu cầu HTTP
- HTTP GET với nội dung yêu cầu
Hầu hết các cuộc thảo luận dường như đồng tình rằng việc cung cấp nội dung thông báo trên một DELETE có thể được phép , nhưng nói chung là không nên.
Hơn nữa, tôi đã nhận thấy một xu hướng trong các thư viện máy khách HTTP khác nhau nơi ngày càng có nhiều cải tiến dường như được ghi lại cho các thư viện này để hỗ trợ các cơ quan yêu cầu trên DELETE. Hầu hết các thư viện dường như bắt buộc, mặc dù đôi khi có một chút kháng cự ban đầu.
Trường hợp sử dụng của tôi yêu cầu việc bổ sung một số siêu dữ liệu bắt buộc trên một DELETE (ví dụ: "lý do" xóa, cùng với một số siêu dữ liệu khác được yêu cầu để xóa). Tôi đã xem xét các tùy chọn sau, không có tùy chọn nào trong số đó có vẻ hoàn toàn phù hợp và phù hợp với thông số kỹ thuật HTTP và / hoặc các phương pháp hay nhất của REST:
- Nội dung thông báo - Thông số chỉ ra rằng nội dung thông báo trên DELETE không có giá trị ngữ nghĩa; không được hỗ trợ đầy đủ bởi các máy khách HTTP; thực hành không tiêu chuẩn
- Tiêu đề HTTP tùy chỉnh - Yêu cầu tiêu đề tùy chỉnh thường chống lại các thông lệ tiêu chuẩn ; sử dụng chúng không phù hợp với phần còn lại của API của tôi, không có API nào yêu cầu tiêu đề tùy chỉnh; hơn nữa, không có phản hồi HTTP tốt nào có sẵn để chỉ ra các giá trị tiêu đề tùy chỉnh xấu (có thể là một câu hỏi riêng biệt hoàn toàn)
- Tiêu đề HTTP tiêu chuẩn - Không có tiêu đề tiêu chuẩn nào phù hợp
- Tham số truy vấn - Thêm tham số truy vấn thực sự thay đổi URI yêu cầu đang bị xóa; chống lại các thông lệ tiêu chuẩn
- Phương thức POST - (ví dụ
POST /resourceToDelete { deletemetadata }
) POST không phải là một tùy chọn ngữ nghĩa để xóa; POST thực sự đại diện cho hành động ngược lại mong muốn (tức là POST tạo tài nguyên cấp dưới; nhưng tôi cần xóa tài nguyên) - Nhiều phương pháp - Chia yêu cầu DELETE thành hai hoạt động (ví dụ: PUT xóa siêu dữ liệu, sau đó DELETE) chia một hoạt động nguyên tử thành hai, có khả năng để lại trạng thái không nhất quán. Lý do xóa (và các siêu dữ liệu có liên quan khác) không phải là một phần của bản trình bày tài nguyên.
Sở thích đầu tiên của tôi có lẽ sẽ là sử dụng nội dung thư, thứ hai là tiêu đề HTTP tùy chỉnh; tuy nhiên, như đã chỉ ra, có một số nhược điểm đối với những cách tiếp cận này.
Có bất kỳ khuyến nghị hoặc phương pháp hay nhất nào phù hợp với các tiêu chuẩn REST / HTTP để đưa siêu dữ liệu bắt buộc như vậy vào các yêu cầu DELETE không? Có bất kỳ lựa chọn thay thế nào khác mà tôi chưa xem xét không?
Jersey
không cho phép nội dungdelete
yêu cầu.