Mam żądanie JSON, które publikuję na adres URL HTTP.
Czy należy to traktować jako miejsce, w 400
którym requestedResource
istnieje pole, ale czy "Roman"
jest ono niepoprawną wartością dla tego pola?
[{requestedResource:"Roman"}]
Powinno to być traktowane jako 400
gdzie "blah"
pole nie istnieje w ogóle?
[{blah:"Roman"}]
Roman
, muszą po prostu zapłacić więcej :)Odpowiedzi:
400 oznacza, że żądanie było źle sformułowane. Innymi słowy, strumień danych wysyłany przez klienta na serwer nie był zgodny z regułami.
W przypadku interfejsu API REST z ładunkiem JSON, 400 jest zwykle i właściwie powiedziałbym, że wskazuje, że JSON jest w jakiś sposób nieprawidłowy zgodnie ze specyfikacją API dla usługi.
Zgodnie z tą logiką oba podane scenariusze powinny mieć 400.
Wyobraź sobie, że zamiast tego były to XML, a nie JSON. W obu przypadkach kod XML nigdy nie przejdzie sprawdzania poprawności schematu - z powodu niezdefiniowanego elementu lub niewłaściwej wartości elementu. To byłaby zła prośba. Ta sama oferta tutaj.
źródło
Od w3.org
źródło
Wybór kodu odpowiedzi HTTP jest dość łatwym zadaniem i można go opisać za pomocą prostych reguł. Jedyną trudną częścią, o której często się zapomina, jest paragraf 6.5 z RFC 7231:
Reguły są następujące:
Więc w twoim przypadku zwróciłem błąd 400 i coś takiego, jeśli „Roman” jest uzyskiwany z danych wejściowych użytkownika, a klient musi mieć określoną reakcję:
lub bardziej ogólny błąd, jeśli taka sytuacja jest złym błędem logicznym u klienta i nie jest oczekiwana, chyba że programista popełnił błąd:
źródło
W żadnym przypadku „składnia jest zniekształcona”. Błędna jest semantyka. Dlatego IMHO 400 nie jest odpowiedni. Zamiast tego należałoby zwrócić wartość 200 wraz z obiektem błędu, takim jak
{ "error": { "message": "Unknown request keyword" } }
cokolwiek innego.Rozważ ścieżki przetwarzania klienta. Błąd w składni (np. Niepoprawny JSON) jest błędem w logice programu, innymi słowy, rodzajem błędu i powinien być odpowiednio traktowany, w sposób podobny do powiedzmy 403; innymi słowy, coś złego poszło nie tak.
Z drugiej strony, błąd w wartości parametru jest błędem semantyki, być może z powodu, na przykład, źle zweryfikowanego wprowadzania danych przez użytkownika. To nie jest błąd HTTP (choć przypuszczam, że może to być 422). Ścieżka przetwarzania byłaby inna.
Na przykład w jQuery wolałbym nie pisać pojedynczej procedury obsługi błędów, która dotyczy zarówno rzeczy takich jak 500, jak i niektórych błędów semantycznych specyficznych dla aplikacji. Inne frameworki, w tym Ember, również traktują błędy HTTP, takie jak 400 i 500, identycznie jak duże awarie tłuszczu, wymagające od programisty wykrycia tego, co się dzieje i rozgałęzienia w zależności od tego, czy jest to „prawdziwy” błąd, czy nie.
źródło
Używanie
400
kodów statusu do jakichkolwiek innych celów niż wskazywanie, że żądanie jest źle sformułowane, jest po prostu błędne.Jeśli ładunek żądania zawiera sekwencję bajtów, której nie można było przeanalizować jako
application/json
(jeśli serwer oczekuje, że format danych), odpowiedni kod stanu to415
:Jeśli ładunek żądania jest poprawny pod względem składniowym, ale semantycznie niepoprawny,
422
można użyć niestandardowego kodu odpowiedzi lub standardowego403
kodu stanu:źródło
image/gif
zamiasttext/json
wContent-Type:
nagłówku. - przypuszczalnie ma to również zastosowanie, jeśli element wieloczęściowy ma określony niewłaściwy typ, patrz tools.ietf.org/html/rfc4918, gdzie omawia 422, aby uzyskać więcej dyskusji,Pomyśl o oczekiwaniach.
Jako aplikacja kliencka spodziewasz się wiedzieć, czy coś pójdzie nie tak po stronie serwera. Jeśli serwer musi zgłosić błąd, gdy go
blah
brakuje lubrequestedResource
wartość jest niepoprawna, odpowiedni byłby błąd 400.źródło
Jako uzupełnienie, dla tych, którzy mogą napotkać ten sam problem, co mój, używam
$.ajax
do wysyłania danych formularza na serwer, a także na początku dostałem400
błąd.Załóżmy, że mam zmienną javascript,
Nie używaj zmiennej
formData
bezpośrednio jako wartości klucza,data
jak poniżej:Zamiast tego użyj JSON.stringify do enkapsulacji
formData
jak poniżej:W każdym razie, jak pokazali inni, błąd polega na tym, że serwer nie mógł rozpoznać żądania powodującego zniekształconą składnię, po prostu zgłaszam wystąpienie w praktyce. Mam nadzieję, że komuś się przyda.
źródło
Najpierw sprawdź, czy adres URL może być niepoprawny, jeśli jest poprawny, a następnie sprawdź wysyłane treści żądania, możliwą przyczyną jest brak właściwej składni żądania.
Aby rozwinąć, sprawdź znaki specjalne w ciągu żądania. Jeśli jest używany (znak specjalny), jest to główna przyczyna tego błędu.
spróbuj skopiować żądanie i przeanalizuj dane każdego tagu.
źródło