Jaki jest prawidłowy kod stanu odpowiedzi na POST, gdy nie można znaleźć zasobu nadrzędnego?

10

Mam następujący punkt końcowy:

a/{id}/b

i chcesz utworzyć żądanie bwysyłania POSTdo niego. Jeśli az podanym {id}nie znaleziono, czy powinienem odpowiedzieć za pomocą, 404 NOT_FOUNDa może za pomocą 409 CONFLICT?

Jest to proste a/{id}, sztuczka polega na tym, że tutaj stosuje się podśrodek.

Opal
źródło

Odpowiedzi:

15

404 NOT FOUNDwydaje się odpowiednią odpowiedzią, ponieważ zasób o tym identyfikatorze nie istnieje. Jest to bardzo jasne do zrozumienia i oczekujesz takiej samej odpowiedzi, jeśli a/{id}zostanie wywołany.

409 CONFLICTnie wydaje mi się lepszym wyborem, ponieważ w twoim przykładzie zwrócisz 409, gdy nie znaleziono zasobu nadrzędnego :).

Ale pamięta, że ​​najważniejszą rzeczą jest spójność interfejsu API

Dherik
źródło
Zgadzam się. Jeśli chcesz zapisać w folderze, który nie istnieje, czy jest to konflikt lub błąd braku folderu? W ten sposób wydaje mi się to bardziej intuicyjne.
Neil
„Folder” oznacza ścieżkę, która nie istnieje?
Dherik
Mam na myśli folder, jak w systemie plików.
Neil
Czy możesz opisać scenariusz? Ponieważ to zależy. Jeśli folder był oczekiwany dla serwera i (z jakiegokolwiek powodu) go nie ma, myślę, że to błąd serwera (5xx), a nie błąd klienta (4xx). Jeśli ta wartość folderu została przekazana przez klienta do zasobu (jako id), wynosi 404. Ale jeśli folder został przekazany w treści, może to być cokolwiek innego (412, 422 ... coś, co reprezentuje "sprawdzanie poprawności nie powiodło się: folder nie nie istnieje"). To dobre pytanie, które należy zadać i przedyskutować.
Dherik
Jeśli poprosisz serwer o plik ze ścieżką /nonexistent/help.html, a folder / noneist nie istnieje, istnieje tylko jedna wyraźna odpowiedź na to. Nie znaleziono pliku 404! Może nawet istnieć plik /home/help.html, a odpowiedź nie będzie się różnić. Jest to wyraźnie aplikacja REST, ale nie widzę powodu, dla którego logika miałaby się zmienić. Rodzic musi najpierw istnieć.
Neil
4

Oprócz odpowiedzi @ Dherik.

Identyfikatory URI są identyfikatorami , dlatego musimy pamiętać, że ( /a/{id}/bjest to identyfikator). URI jest bez znaczenia dla WWW, a więc jest dla klienta HTTP.

404 to właściwa odpowiedź . Zasadniczo serwer odpowiada

Nie znalazłem żadnych zasobów o takim identyfikatorze. Nie znaleziono zasobu 1

To, czy brakujący zasób jest nadrzędny czy podrzędny, nie ma znaczenia.

My, programiści, widzimy hierarchie i ścieżki w URI, ale klienci HTTP nie. Innymi słowy, HTTP ma być interpretowany tylko przez klientów HTTP, ale nie przez ludzi (deweloperów, użytkowników końcowych itp.).

W przypadku wątpliwości nie pytaj, jaki kod ma dla ciebie sens (człowiek). Nie pytaj, jaki kod ma sens dla klienta HTTP. Jak chcesz zachowywać się klient HTTP?

Dlaczego? Ponieważ niektóre kody stanu powodują, że klienci wykonują określone operacje. Na przykład 302 . Ten kod zazwyczaj powoduje, że przeglądarki internetowe przekierowują do określonej lokalizacji (URI) informowane w nagłówkach odpowiedzi.

To może nie być twój przypadek, ale ważne jest, aby być świadomym. Ostatecznie kody stanu HTTP są adresowane do klientów HTTP. Nie do naszych aplikacji. Nie dla osób.


1: 409 rzadko jest implementowany jako błąd nawigacji. Zwykle wiąże się to z wykonywaniem zdalnych operacji (usuwanie, aktualizacja, nowe itp.). Ale identyfikator URI powinien istnieć. W przeciwnym razie zwycięży 404

Laiv
źródło