Podczas gdy HTTP 1.1 spec wydaje się zezwalać na żądania ciał na żądania , wydaje się, że serwery powinny go zignorować, ponieważ nie ma dla niego zdefiniowanej semantyki.RESTful Alternatywy dla żądania usunięcia ciała
4,3 Treść wiadomości
Serwer powinien przeczytać i przekazać wiadomość-ciało na każde żądanie; jeśli metoda żądania nie zawiera zdefiniowanej semantyki dla jednostki-podmiotu, , wówczas treść komunikatu POWINIEN być zignorowana podczas obsługi żądania.
Już przeglądowi kilka podobnych dyskusji na ten temat na SO i poza nią, takie jak:
- Is an entity body allowed for an HTTP DELETE request?
- Payloads of HTTP Request Methods
- HTTP GET with request body
Większość dyskusji wydają się zgadzają się, że podanie treści wiadomości na DELETE może być dozwolone , ale generalnie nie jest zalecane.
Co więcej, zauważyłem trend w różnych bibliotekach klientów HTTP, w których coraz więcej ulepszeń wydaje się być rejestrowanych dla tych bibliotek, aby obsługiwać ciałach żądań przy usuwaniu. Większość bibliotek wydaje się zobowiązywać, choć czasami z niewielkim początkowym oporem.
Mój przypadek użycia wymaga dodania niektórych wymaganych metadanych podczas operacji DELETE (np. "Przyczyna" usunięcia, a także kilka innych metadanych wymaganych do usunięcia). Mam rozważyć następujące opcje, z których żadna nie wydają się całkowicie właściwe i inline ze specyfikacją HTTP i/lub reszta najlepszych praktyk:
- Treść wiadomości - Spec wskazuje, że treść wiadomości na DELETE nie mają wartości semantycznej; nie w pełni obsługiwany przez klientów HTTP; niestandardowa praktyka
- Niestandardowe nagłówki HTTP - Wymaganie niestandardowych nagłówków jest zwykle następujące: against standard practices; ich używanie jest niezgodne z resztą mojego API, z których żaden nie wymaga niestandardowych nagłówków; Ponadto, nie jest dobre odpowiedzi HTTP dostępny do wskazania wartości nagłówków złe niestandardowych (prawdopodobnie osobną pytanie łącznie)
- standardowe nagłówki HTTP - Brak standardowe nagłówki są odpowiednie
- Parametry zapytania - tworzenie kwerendy params faktycznie zmienia się request- Identyfikator URI został usunięty; against standard practices
- Metoda POST - (np.
POST /resourceToDelete { deletemetadata }
) POST nie jest opcją semantyczną do usuwania; POST faktycznie reprezentuje odwrotny działania pożądanego (tj POST tworzy podwładnych zasobów, ale muszę usunąć zasób) - wiele metod - podział żądanie DELETE na dwie operacje (np PUT usuwać metadane, a następnie usunąć) dzieli operacja atomowa na dwie, potencjalnie pozostawiając niespójny stan.Przyczyna usunięcia (i inne powiązane metadane) nie są częścią samej reprezentacji zasobów.
Moją pierwszą preferencją byłoby prawdopodobnie użycie treści wiadomości, a po drugie niestandardowe nagłówki HTTP; jednak, jak wskazano, istnieją pewne wady tych podejść.
Czy istnieją jakieś zalecenia lub najlepsze praktyki zgodne ze standardami REST/HTTP dotyczące uwzględniania takich wymaganych metadanych w żądaniach DELETE? Czy są jakieś inne alternatywy, których nie rozważałem?
Niektóre implementacje, takie jak 'Jersey', nie dopuszczają treści dla żądań' delete'. – basiljames
Naprawdę wydaje się, że nie ma dobrej odpowiedzi na ten problem. – niico