Odpowiedzi:
Status 422 wydaje się najbardziej odpowiedni na podstawie specyfikacji .
Kod statusu 422 (Unprocessable Entity) oznacza, że serwer rozumie typ treści encji żądania (stąd kod statusu 415 (Unsupported Media Type) jest nieodpowiedni), a składnia encji żądania jest poprawna (a więc 400 (Bad Request ) kod stanu jest nieodpowiedni), ale nie mógł przetworzyć zawartych instrukcji. Na przykład ten warunek błędu może wystąpić, jeśli treść żądania XML zawiera dobrze sformułowane (tj. Poprawne składniowo), ale semantycznie błędne instrukcje XML.
Twierdzą, że źle sformułowany plik XML jest przykładem złej składni (woła o 400). Zniekształcony ciąg zapytania wydaje się analogiczny do tego, więc 400 nie wydaje się odpowiednie dla poprawnie sformułowanego ciągu zapytania, w którym brakuje parametru.
AKTUALIZACJA @DavidV poprawnie wskazuje, że ta specyfikacja dotyczy WebDAV, a nie rdzenia HTTP. Ale niektóre popularne interfejsy API inne niż WebDAV i tak używają 422, z powodu braku lepszego kodu stanu ( zobacz to ).
400
jest bardziej odpowiedni.
Nie jestem pewien, czy istnieje ustalony standard, ale użyłbym 400 złych żądań , które najnowsza specyfikacja HTTP (z 2014 r.) Dokumentuje w następujący sposób :
6.5.1 400 złych wnioskówKod statusu 400 (Błędne żądanie) wskazuje, że serwer nie może lub nie przetworzy żądania z powodu czegoś, co jest postrzegane jako błąd klienta (np. Źle sformułowana składnia żądania, nieprawidłowe sformułowanie komunikatu żądania lub oszukańczy routing żądania).
400 Bad Request
ma wskazywać problemy na poziomie protokołu, a nie błędy semantyczne. Jeśli mamy zamiar przejąć kody stanu HTTP, aby wskazać błędy na poziomie aplikacji (a nie na poziomie protokołu), dlaczego nie przejść do końca i po prostu użyć 412
?
WCF API w uchwyty .NET brakuje parametrów poprzez odesłanie HTTP 404
„Endpoint Not Found” błąd, gdy za pomocą webHttpBinding .
404 Not Found
Może mieć sens, jeśli wziąć pod uwagę swój serwis WWW nazwę metody wraz z jego podpisem parametrów. Oznacza to, że jeśli ujawnisz metodę usługi sieci Web LoginUser(string, string)
i poprosisz LoginUser(string)
, tej drugiej nie można znaleźć.
Zasadniczo oznaczałoby to, że nie można znaleźć wywoływanej metody usługi sieci Web oraz podanego podpisu parametru.
10.4.5 404 Nie znaleziono
Serwer nie znalazł nic pasującego do URI żądania. Nie podano żadnych wskazówek, czy stan jest tymczasowy czy trwały.
400 Bad Request
, Jak sugeruje Gert pozostaje ważny kod odpowiedzi, ale myślę, że jest zwykle używany do wskazania problemów z niższego poziomu. Można to łatwo zinterpretować jako zniekształcone żądanie HTTP, być może brakujące lub nieprawidłowe nagłówki HTTP lub podobne.
10.4.1 400 Zła prośba
Serwer nie mógł zrozumieć żądania z powodu nieprawidłowej składni. Klient NIE POWINIEN powtarzać żądania bez modyfikacji.
W jednym z naszych projektów API postanawiamy ustawić status 409 na niektóre żądania, gdy nie możemy wypełnić go w 100% z powodu braku parametru.
Kod statusu HTTP „Konflikt 409” był dla nas dobrą próbą, ponieważ jego definicja wymaga podania wystarczającej ilości informacji, aby użytkownik mógł rozpoznać źródło konfliktu.
Odniesienie: w3.org/Protocols/
Tak więc wśród innych odpowiedzi, takich jak 400 lub 404, wybraliśmy 409, aby wymusić potrzebę przejrzenia niektórych notatek w żądaniu, które pomogą ustalić nowe i właściwe żądanie.
W każdym razie nasz przypadek był szczególny, ponieważ musimy wysłać wigilię danych, jeśli żądanie nie było całkowicie poprawne, i musimy zmusić klienta do spojrzenia na wiadomość i zrozumienia, co było nie tak w żądaniu.
Ogólnie, jeśli mamy tylko brakujący parametr, wybieramy 400 i tablicę brakującego parametru. Ale kiedy musimy wysłać więcej informacji, na przykład konkretny komunikat sprawy i chcemy być bardziej pewni, że klient się tym zajmie, wysyłamy 409
Zwykle wybieram 422 (encja nieprzetworzona), jeśli coś w wymaganych parametrach nie odpowiada wymaganemu punktowi końcowemu API (jak zbyt krótkie hasło), ale dla brakującego parametru wybrałbym 406 (niedopuszczalne).
Accept-Language: de
, wskazujące, że akceptuje tylko odpowiedzi w języku niemieckim, ale jedyne wersje żądanego dokumentu, które serwer ma dostępny, są w języku angielskim lub francuskim.) Użycie go do wskazania brakującego parametru w żądaniu jest nieprawidłowe, zgodnie z definicją w specyfikacji.
Dla zainteresowanych Spring MVC (przynajmniej 3.x) zwraca w tym przypadku 400, co wydaje mi się błędne.
Przetestowałem kilka adresów URL Google (accounts.google.com) i usunąłem wymagane parametry, które zazwyczaj zwracają 404 w tym przypadku.
Skopiowałbym Google.
Można argumentować, że 404 Not Found
należy użyć a, ponieważ nie można znaleźć określonego zasobu.
Często używam błędu 403 Forbidden. Powodem jest to, że prośba została zrozumiana, ale nie zrobię tego, o co poproszono (ponieważ coś jest nie tak). Jednostka odpowiedzi wyjaśnia, co jest nie tak, więc jeśli odpowiedzią jest strona HTML, komunikaty o błędach znajdują się na stronie. Jeśli jest to odpowiedź JSON lub XML, informacja o błędzie jest tam.
Od rfc2616 :
10.4.4 403 Zabronione
Serwer zrozumiał żądanie, ale odmawia jego spełnienia.
Autoryzacja nie pomoże, a prośba NIE POWINNA zostać powtórzona.
Jeśli metoda żądania nie była HEAD, a serwer chce podać do
publicznej wiadomości, dlaczego żądanie nie zostało spełnione, POWINIEN opisać przyczynę odmowy w jednostce. Jeśli serwer nie chce udostępnić tych informacji klientowi,
zamiast tego można użyć kodu stanu 404 (Nie znaleziono).
Authorization will not help
, więc Twitter nie powinien wysyłać tego z powodu nieprawidłowych poświadczeń OAuth.
401 Unauthorized
zamiast tego wysyłać . Możesz jednak zrozumieć, dlaczego tak nie jest, jeśli spojrzysz na opisy tych dwóch kodów, które są bardzo podobne do dokumentów MDN .
Aby użyć ASP.NET Core jako odniesienia lub przykładu, ASP.NET Core umożliwia rusztowanie kontrolera z akcjami, tak wygląda akcja „Szczegóły”.
// GET: Cars/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
if (car == null)
{
return NotFound();
}
return View(car);
}
Jeśli parametr id
nie jest ustawiony, zwraca 404 Not Found.
Zwróć 404 - co oznacza, że nie można znaleźć zasobu.
Spróbuj edytować adres URL witryny zawierającej identyfikator. Próbowałem kilka:
Wszystkie zwracają 404, imo, ponieważ ci programiści poprawnie interpretują standard, czego nie ma tutaj odpowiedź i wiele innych!
requestBody
.
Wybrałbym 403.
Z RFC 2616 - Hypertext Transfer Protocol - HTTP / 1.1
403 Zabronione
Serwer zrozumiał żądanie, ale odmawia jego spełnienia. Autoryzacja nie pomoże, a prośba NIE POWINNA zostać powtórzona. Jeśli metoda żądania nie była HEAD, a serwer chce podać do publicznej wiadomości, dlaczego żądanie nie zostało spełnione, POWINIEN opisać przyczynę odmowy w jednostce. Jeśli serwer nie chce udostępnić tych informacji klientowi, zamiast tego można użyć kodu stanu 404 (Nie znaleziono).
Powinieneś opisać przyczynę niepowodzenia w swojej odpowiedzi. Jeśli wolisz tego nie robić, po prostu użyj 404.