Prawidłowa odpowiedź na pusty stół?

Załóżmy, że chcesz uzyskać listę użytkowników przez wywołanie GET do api/users, ale obecnie tabela została obcięta, więc nie ma użytkowników. Jaka jest właściwa odpowiedź na ten scenariusz: 404 lub 204?

 110
Author: kiedysktos, 2012-11-13

5 answers

Ja bym tak nie powiedział.

Dlaczego nie 404 (Nie znaleziono) ?

Kod statusu 404 powinien być zarezerwowany dla sytuacji, w których zasób nie został znaleziony. W tym przypadku Twoim zasobem jest kolekcja użytkowników. Ta kolekcja istnieje, ale obecnie jest pusta. Osobiście byłbym bardzo zdezorientowany jako autor klienta dla Twojej aplikacji, gdybym dostał 200 jednego dnia i 404 następnego dnia tylko dlatego, że ktoś zdarzył się usunąć kilku użytkowników. Co mam zrobić? Is my URL źle? Czy ktoś zmienił API i zaniedbał pozostawienie przekierowania.

Dlaczego nie 204 (Brak treści)?

Oto fragment opisu kodu stanu 204 przez W3C

Serwer spełnił żądanie, ale nie musi zwracać podmiotu-ciała i może chcieć zwrócić zaktualizowane metainformacje.

Chociaż może to wydawać się rozsądne w tym przypadku, myślę, że to również dezorientuje klientów. A 204 ma wskazywać, że niektóre operacje zostały wykonane pomyślnie i żadne dane nie muszą być zwracane. Jest to idealne rozwiązanie jako odpowiedź na DELETE żądanie lub może uruchomienie jakiegoś skryptu, który nie musi zwracać danych. W przypadku api/users, Zwykle oczekujesz, że otrzymasz reprezentację swojej kolekcji użytkowników. Wysyłanie organu odpowiedzi jeden raz, a nie wysyłanie go za drugim razem jest niespójne i potencjalnie wprowadzające w błąd.

Dlaczego używam 200 (OK)

Z powodów wymienionych powyżej (spójność), zwracam reprezentacja zbioru pustego. Załóżmy, że używasz XML. Normalne ciało odpowiedzi dla niepustej kolekcji użytkowników może wyglądać tak:

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

A jeśli lista jest pusta, możesz po prostu odpowiedzieć czymś takim (wciąż używając 200):

<users/>

Tak czy inaczej, klient otrzymuje ciało odpowiedzi, które podąża za pewnym, dobrze znanym formatem. Nie ma niepotrzebnego zamieszania i sprawdzania kodu statusu. Nie naruszono również definicji kodu statusu. Everybody ' s szczęśliwy.

Możesz zrobić to samo z JSON lub HTML lub dowolnym formatem, którego używasz.

 239
Author: toniedzwiedz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 19:53:01

Odpowiedziałbym na jeden z dwóch kodów w zależności od sytuacji runtime:

404 (Nie Znaleziono)

Ta odpowiedź jest całkiem poprawna, jeśli nie masz tabeli. Nie tylko pusta tabela, ale BRAK tabeli użytkownika. Potwierdza dokładny pomysł-brak zasobów. Dalsze opcje są, aby podać więcej szczegółów, dlaczego tabela jest nieobecny, istnieje kilka bardziej szczegółowych kodów, ale 404 jest całkiem dobry, aby odnieść się do sytuacji, w której naprawdę nie ma tabeli.

200 (OK)

Wszystkie przypadki, w których masz tabela, ale jest pusta lub procesor żądań odfiltrował wszystkie wyniki. Oznacza to, że " twoje żądanie jest poprawne, wszystko jest w porządku, ale nie dopasowujesz żadnych danych tylko dlatego, że albo nie mamy danych, albo nie mamy danych, które pasują do twojego żądania. Powinno to różnić się od security denial answer. Głosuję również za zwróceniem 200 w sytuacji, gdy masz jakieś Dane i ogólnie masz dostęp do tabeli, ale nie masz dostępu do wszystkich danych, które pasują do Twojej prośby (dane zostały odfiltrowane z powodu bezpieczeństwo na poziomie obiektu, ale ogólnie można żądać).

 15
Author: Roman Nikitchenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 22:16:22

Jeśli oczekujesz listy obiektów user, najlepszym rozwiązaniem jest zwrócenie pustej listy ([]) z 200 OK, niż użycie odpowiedzi 404 lub 204.

 10
Author: geek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-18 17:20:04

Musi 200 OK z pustą listą.

Why: Empty table oznacza, że tabela istnieje, ale nie ma żadnych rekordów.

404 Not Found oznacza, że żądany punkt końcowy nie istnieje.

 3
Author: Amir Raza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-29 05:36:19

Zdecydowanie zwraca 200.

404 oznacza zasób nie znaleziony. Ale zasób istnieje. A także, jeśli odpowiedź ma status 404. Skąd możesz wiedzieć, że lista użytkowników jest pusta lub wypełniona?


  • '/ users 'if is empty should return '200'.
  • '/ users / 1 ' jeśli id nie zostało znalezione. powinien zwrócić 404.
 2
Author: Liva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-12 12:10:28