Wyobraź sobie serwis internetowy REST, w którym dodajesz elementy do jakiegoś typu kontenera. Na przykład, powiedzmy, że możemy dodać uczestników organizowanych # 789 do zdarzenia nr 456 tak:Czy HTTP 404 jest odpowiednią odpowiedzią dla operacji PUT, w której nie znaleziono jakiegoś powiązanego zasobu?
PUT http://..../api/v1/events/456/attendees/789
Jeśli któryś zdarzenie nr 456 lub obecnościach # 789 nie istnieje, jest to prawidłowe, aby powrócić HTTP 404 (wraz ze szczegółowym ładunkiem błędu wyjaśniającym, na czym polegał problem, np. { "error" : { "message" : "Event 456 does not exist" , "code" : "404" } }
?
Podobnie, jeśli tworzę coś nowego, co odnosi się do innego obiektu, ale drugi obiekt nie istnieje? Na przykład wyobraź sobie, że tworzę wydarzenie w lokalizacji # 123
PUT http://..../api/v1/event
{ "location": 123, "name": "Party", "date": "2012-05-23", ...etc... }
Jeśli Lokalizacja nr 123 nie istnieje, czy poprawne jest również zwracanie 404 (wraz z szczegółami w odpowiedzi)? Jeśli nie, co byłoby właściwe - po prostu 400?
Według specyfikacji HTTP 1.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
9,6 PUT ... Jeśli zasób nie mógł zostać utworzony lub zmodyfikowany z żądaniem-URI, odpowiednia reakcja na błąd należy przyznać, że odzwierciedla charakter problemu
Tak, że wydaje się być dobry głos do reagowania z 404. jednak z jakiegoś powodu nie mogę całkiem umieścić mój palec, odpowiadając na PUT (lub POST) z 404 wydaje dziwne dla ja ... Być może dlatego, że 404 oznacza, że zasobu nie można znaleźć, ale w tym przypadku nasz zasób jest w rzeczywistości powiązaniem między dwoma innymi zasobami i jest jednym z tych dwóch zasobów, których nie można znaleźć.
Nie przejmujcie się zbytnio moimi dokładnymi przykładami tutaj - są one sporządzone w celu zilustrowania tego. Główne pytanie brzmi: czy 404 jest właściwą odpowiedzią na operację PUT, która nie działa, ponieważ nie znaleziono powiązanego zasobu?
Byłoby wspaniale, gdyby można było wskazać odniesienia - ciężko jest mi znaleźć takie, które uzyskają taki poziom szczegółowości i są wystarczająco wiarygodne. Szczególnie w odniesieniu do traktowania relacji z zasobami w projekcie interfejsu REST API.
Zaktualizowane myślenie Myślę, że prawdopodobnie pierwszy przykład powinien powrócić 404, drugi nie powinien. Rozumowanie polega na tym, że w pierwszym przypadku dodawany przez nas zasób używa zdarzenia 456 i uczestnika 789 jako złożonego klucza podstawowego; druga lokalizacja sprawy to tylko klucz obcy. W drugim przypadku powinien zostać zwrócony błąd, ale nie 404 - prawdopodobnie 412 warunków wstępnych nie powiodło się lub może tylko 400 złych wniosków. Myśli?
IMHO z perspektywy klienta uruchamiasz z katalogu głównego ('/') i idąc ścieżką. Jeśli w którymś momencie nie znajdziesz części ścieżki, powinieneś rzucić 404 z niecierpliwością. Byłoby miło, gdybyś mógł podać, która część faktycznie zawiodła, ale uważam, że 404 jest uzasadnione. –