Prawidłowy kod statusu HTTP do złego wprowadzenia

169

Jaki jest optymalny kod odpowiedzi HTTP, jeśli nie zgłasza 200 (wszystko jest w porządku), ale błąd danych wejściowych?

Na przykład przesyłasz jakieś dane do serwera, a on odpowie, że Twoje dane są nieprawidłowe

używanie 500wygląda bardziej jak problem z serwerem
używanie 200z ostrzeżeniem / błędem tekst odpowiedzi jest zły (zezwala na buforowanie i wszystko nie jest w porządku)
używanie 204i zwracanie niczego, może jest dobre (ale dobrze obsługiwane?)
użycie 404jest nieprawidłowe, jeśli żądana ścieżka (skrypt) jest dostępna i we właściwym miejscu

Marek Sebera
źródło
Zobacz moją odpowiedź, aby poznać szczegóły stackoverflow.com/a/59527615/4127230
shiva2492

Odpowiedzi:

210

Mieliśmy ten sam problem podczas tworzenia naszego API. Szukaliśmy kodu stanu HTTP odpowiadającego plikowi InvalidArgumentException. Po przeczytaniu poniższego artykułu źródłowego użyliśmy następujących 422 Unprocessable Entitystwierdzeń:

Kod statusu 422 (Unprocessable Entity) oznacza, że ​​serwer rozumie typ zawartości jednostki żądania (stąd kod statusu 415 (Unsupported Media Type) jest nieodpowiedni), a składnia jednostki żądania jest poprawna (a zatem 400 (Bad Request ) kod statusu 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 poprawnie sformułowane (tj. Poprawne składniowo), ale semantycznie błędne instrukcje XML.

źródło: https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm

Keego
źródło
138

Kody zaczynające się od 4 (4xx) są przeznaczone dla błędów klienta. Może 400 (złe żądanie) mogłoby być odpowiednie w tym przypadku? Definicja w http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html mówi:

„Żądanie nie mogło zostać zrozumiane przez serwer z powodu nieprawidłowej składni. Klient NIE POWINIEN powtarzać żądania bez modyfikacji”.

esaj
źródło
13
400 Bad Requestnie jest zły, ale generalnie powinien być zarezerwowany dla nieprawidłowej składni. OP wydaje się być bardziej zaniepokojony przypadkiem z dobrze sformułowaną składnią, ale nieprawidłowymi wartościami. Plus 400 to dość powszechny kod odpowiedzi typu „o cholera, coś było nie tak”, który możesz chcieć odróżnić od konkretnego przypadku błędnych danych wejściowych.
Keego
4
Zwróć uwagę, że sformułowanie zostało zaktualizowane w RFC 7231, a „Żądanie nie mogło zostać zrozumiane przez serwer z powodu nieprawidłowej składni” zostało zaktualizowane na „serwer nie może lub nie może przetworzyć żądania z powodu czegoś, co jest postrzegane jako klient błąd (np. zniekształcona składnia żądania, nieprawidłowe ramkowanie komunikatu żądania lub oszukańcze kierowanie żądań) ”.
Calimo
14

Oprócz specyfikacji RFC można to również zobaczyć w akcji. Sprawdź odpowiedzi na Twitterze.

https://developer.twitter.com/en/docs/ads/general/guides/response-codes

Tłum
źródło
19
Możesz uzyskać więcej głosów pozytywnych, jeśli wyciągniesz przykłady z linków.
Jared Thirsk
Podałem
1
Dla mnie link ( fb-developers.info/tech/fb_dev/faq/general/gen_10.html ) prowadzi do losowej reklamy. Myślę, że domena została sfałszowana
dmitry502
@ dmitry502 Zredagowano odpowiedź, aby usunąć sfałszowany link. Dzięki za komentarz
Francis
9

409 Conflict mogłoby być akceptowalnym rozwiązaniem.

Według: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Żądanie nie mogło zostać zrealizowane z powodu konfliktu z bieżącym stanem zasobu. Ten kod jest dozwolony tylko w sytuacjach, w których oczekuje się, że użytkownik będzie w stanie rozwiązać konflikt i ponownie przesłać żądanie. Treść odpowiedzi POWINNA zawierać wystarczającą ilość informacji, aby użytkownik mógł rozpoznać źródło konfliktu. Idealnie byłoby, gdyby jednostka odpowiedzi zawierała wystarczającą ilość informacji dla użytkownika lub agenta użytkownika, aby rozwiązać problem; jednak może to nie być możliwe i nie jest wymagane.

Dokument kontynuuje przykład:

Konflikty najprawdopodobniej wystąpią w odpowiedzi na żądanie PUT. Na przykład, jeśli używane były wersje, a jednostka PUT zawierała zmiany w zasobie, które są sprzeczne z tymi wprowadzonymi przez wcześniejsze żądanie (strony trzeciej), serwer może użyć odpowiedzi 409, aby wskazać, że nie może wykonać żądania . W takim przypadku jednostka odpowiedzi prawdopodobnie zawierałaby listę różnic między dwiema wersjami w formacie zdefiniowanym przez odpowiedź Content-Type.


W moim przypadku chciałbym umieścić ciąg, który musi być unikalny, w bazie danych za pośrednictwem API. Przed dodaniem go do bazy sprawdzam, czy nie ma go już w bazie.

Jeśli tak, wrócę "Error: The string is already in the database", 409.

Uważam, że właśnie tego chciał OP: kod błędu odpowiedni na wypadek, gdyby dane nie spełniały kryteriów serwera.

Alex Fortin
źródło
2

Zgodnie z poniższym scenariuszem

Powiedzmy, że ktoś wysyła żądanie do Twojego serwera z danymi, które są w odpowiednim formacie, ale po prostu nie są „dobrymi” danymi. Na przykład wyobraź sobie, że ktoś wysłał wartość typu String do punktu końcowego interfejsu API, który oczekiwał wartości typu String; ale wartość ciągu zawierała dane, które były na czarnej liście (np. uniemożliwiały ludziom używanie „hasła” jako hasła). wtedy kod statusu mógłby wynosić 400 lub 422?

Do tej pory zwracałbym „400 złych żądań”, co według w3.org oznacza:

Żądanie nie mogło zostać zrozumiane przez serwer z powodu nieprawidłowej składni. Klient NIE POWINIEN powtarzać żądania bez modyfikacji.

Ten opis nie do końca pasuje do okoliczności; ale jeśli przejdziesz przez listę podstawowych kodów stanu HTTP zdefiniowanych w protokole HTTP / 1.1, jest to prawdopodobnie najlepszy wybór.

Ostatnio jednak ktoś z mojego zespołu deweloperów zwrócił mi uwagę, że popularne interfejsy API zaczynają używać rozszerzeń HTTP, aby uzyskać bardziej szczegółowe informacje o raportowaniu błędów. W szczególności wiele interfejsów API, takich jak Twitter i Recurly, używa kodu stanu „422 Unprocessable Entity”, zgodnie z definicją w rozszerzeniu HTTP dla WebDAV. Kod stanu HTTP 422 mówi:

Kod statusu 422 (Unprocessable Entity) oznacza, że ​​serwer rozumie typ zawartości jednostki żądania (stąd kod statusu 415 (Unsupported Media Type) jest nieodpowiedni), a składnia jednostki żądania jest poprawna (a zatem 400 (Bad Request ) kod statusu 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 poprawnie sformułowane (tj. Poprawne składniowo), ale semantycznie błędne instrukcje XML.

Wracając do naszego przykładu hasła z góry, ten kod statusu 422 wydaje się znacznie bardziej odpowiedni. Serwer rozumie, co próbujesz zrobić; i rozumie dane, które przesyłasz; po prostu nie pozwoli na przetwarzanie tych danych.

shiva2492
źródło
-7

404 - Nie znaleziono - można użyć dla Żądany identyfikator URI jest nieprawidłowy lub żądany zasób, taki jak użytkownik, nie istnieje.

użytkownik
źródło
2
OP już to wykluczył: „ użycie 404 jest niewłaściwe, jeśli żądana ścieżka (skrypt) jest dostępna i we właściwym miejscu
Remy Lebeau