Chociaż specyfikacja HTTP 1.1 wydaje się zezwalać na treści wiadomości w żądaniach DELETE , wydaje się wskazywać, że serwery powinny ją ignorować, ponieważ nie ma dla niej zdefiniowanej semantyki.
4.3 Treść wiadomości
Serwer POWINIEN odczytać i przesłać dalej treść wiadomości na każde żądanie; jeśli metoda żądania nie obejmuje zdefiniowanej semantyki dla treści jednostki, wówczas treść wiadomości POWINNA zostać zignorowana podczas obsługi żądania.
Przejrzałem już kilka powiązanych dyskusji na ten temat w SO i nie tylko, takich jak:
- Czy treść jednostki jest dozwolona dla żądania HTTP DELETE?
- Ładunki metod żądań HTTP
- HTTP GET z treścią żądania
Większość dyskusji wydaje się zgadzać, że dostarczanie treści wiadomości w DELETE może być dozwolone , ale generalnie nie jest zalecane.
Co więcej, zauważyłem trend w różnych bibliotekach klienta HTTP, w którym wydaje się, że coraz więcej ulepszeń jest rejestrowanych dla tych bibliotek w celu obsługi treści żądań w DELETE. Większość bibliotek wydaje się być do tego zobowiązana, choć czasami z niewielkim początkowym oporem.
Mój przypadek użycia wymaga dodania niektórych wymaganych metadanych do DELETE (np. „Powód” usunięcia, wraz z innymi metadanymi wymaganymi do usunięcia). Rozważyłem następujące opcje, z których żadna nie wydaje się całkowicie odpowiednia i zgodna ze specyfikacjami HTTP i / lub najlepszymi praktykami REST:
- Treść wiadomości - specyfikacja wskazuje, że treści wiadomości w DELETE nie mają wartości semantycznej; nie w pełni obsługiwane przez klientów HTTP; nie jest to standardowa praktyka
- Niestandardowe nagłówki HTTP - wymaganie niestandardowych nagłówków jest generalnie sprzeczne ze standardowymi praktykami ; używanie ich jest niezgodne z resztą mojego API, z których żadne nie wymaga niestandardowych nagłówków; ponadto brak jest dobrej odpowiedzi HTTP wskazującej złe wartości nagłówka niestandardowego (prawdopodobnie jest to zupełnie oddzielne pytanie)
- Standardowe nagłówki HTTP - żadne standardowe nagłówki nie są odpowiednie
- Parametry zapytania - dodanie parametrów zapytania w rzeczywistości zmienia usuwany identyfikator URI żądania; przeciwko standardowym praktykom
- Metoda POST - (np.
POST /resourceToDelete { deletemetadata }
) POST nie jest semantyczną opcją usuwania; POST w rzeczywistości reprezentuje odwrotną pożądaną akcję (tj. POST tworzy podrzędne zasoby; ale muszę usunąć zasób) - Wiele metod - Dzielenie żądania DELETE na dwie operacje (np. PUT delete metadata, a następnie DELETE) dzieli niepodzielną operację 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 następnie niestandardowych nagłówków HTTP; jednak, jak wskazano, podejście to ma pewne wady.
Czy istnieją jakieś zalecenia lub najlepsze praktyki zgodne ze standardami REST / HTTP dotyczące umieszczania takich wymaganych metadanych w żądaniach DELETE? Czy są jakieś inne alternatywy, których nie rozważałem?
Jersey
nie zezwalają nadelete
treść żądań.