Wyobraź sobie interfejs API pozwalający ustalić, czy dana osoba wybrała zwierzę duchowe. Mogą mieć tylko zero lub jeden duchowy zwierzak.
Obecnie:
/person/{id}/selectedSpiritAnimal
po wybraniu zwierzę zwraca http 200 i {selectedAnimal:mole}
ale gdy nie mają wyboru, zwraca http 404.
To sprawia, że moje zwierzę duchowe jest nieszczęśliwe, ponieważ reprezentujemy ważny problem związany z domeną - nie wybrałem jeszcze zwierzęcia duchowego - jako błąd HTTP.
Ponadto, jako firma - erm Sprit-Animal-Hampers-R-us - chcemy wiedzieć, kiedy ktoś nie ma wyboru, abyśmy mogli go o to poprosić.
Jaka jest lepsza odpowiedź tutaj:
HTTP 200 i {selectedAnimal:null}
lub nawet bardziej wyraźnie
HTTP 200 i {selectedAnimal:null, spiritAnimalSelected: false}
A może lepiej jest zwrócić 404? Ponieważ podobnie jak this image has not yet been uploadedpodczas oglądania obrazu w trybie online byłoby 404. this person has not selected a spirit animalmoże być 404
To pytanie zostało zaproponowane jako duplikat, ale pytanie to dotyczy innego ważnego adresu URL wymaganego, gdy aplikacja została skonfigurowana tak, aby nie zezwalać na zmianę reprezentowaną przez adres URL.
Podczas gdy tutaj patrzę, jak reprezentuje się zasób, w którym brak zasobu jest znaczący. Oznacza to, że klient może zażądać adresu URL, a odpowiedź brzmi: pomyślnie zażądałeś zasobu, który reprezentuje brak jakiejś rzeczy.
Więc to nie jest „logika biznesowa”, ale raczej okoliczność, w której brak czegoś ma znaczenie (może być tak, jak wielu moich kolegów twierdzi, że 404 jest nadal poprawne), ale nie jestem pewien, jak odwzorować to na spec.
Bardzo trudno jest wybrać odpowiedź. Wielokrotnie zmieniałem zdanie na temat rozmowy tutaj i tej trwającej w pracy.
Rzeczą, która mnie tu rozlicza, jest to, że specyfikacja mówi, że 4xx jest wtedy, gdy klient się pomylił . W tym przypadku klientowi powiedziano, aby oczekiwał odpowiedzi z wybranego adresu URLSpiritAnimal, więc nie popełnił błędu.
Konsensus wśród moich kolegów jest taki, że jest to objaw złego projektu API
Prawdopodobnie byłoby lepiej, gdybyśmy po prostu poprosili / person / {id}, a to zwróci zestaw relacji linków dla tej osoby ... to jeśli nie otrzymasz linku / selectedSpiritAnimal (gdy dana osoba nie ma wyboru), ale ty nazwij to mimo to, wtedy 404 ma sens. Lub że implementujesz częściowe odpowiedzi i pozwalasz / person / {id} zwrócić pełniejszy dokument, chyba że klient zażąda podzbioru danych