Czy resztę komunikatu o błędzie w nagłówku HTTP lub treści odpowiedzi?

84

Mam usługę REST, która jest dostępna dla klientów iPhone i Android. Obecnie śledzę kody HTTP 200, 400, 401, 403, 404, 409, 500 itd.

Moje pytanie brzmi: gdzie jest zalecane miejsce na umieszczenie przyczyny / opisu / przyczyny błędu? Czy bardziej sensowne jest, aby interfejs API REST zawsze miał niestandardową przyczynę w nagłówku?

< HTTP/1.1 400 Bad Request - Missing Required Parameters.
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked

A może lepiej mieć go w treści odpowiedzi za pośrednictwem JSON?

< HTTP/1.1 400 Bad Request
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: application/json
{ "error" : "Missing Required Parameters" }
James Cowhen
źródło
6
Obecnie powszechną praktyką jest dodawanie niestandardowych nagłówków, takich jak „X-HTTP-Error-Description: brak wymaganych parametrów”.
andreszs

Odpowiedzi:

96

Cytując ze specyfikacji HTTP dla kodów błędów 400.x:

Klasa 4xx kodu statusu jest przeznaczona dla przypadków, w których klient popełnił błąd. Z wyjątkiem odpowiedzi na żądanie HEAD, serwer POWINIEN dołączyć jednostkę zawierającą wyjaśnienie sytuacji błędu oraz informację, czy jest to stan tymczasowy czy trwały. Te kody stanu mają zastosowanie do każdej metody żądania. Programy użytkownika POWINNY wyświetlać użytkownikowi wszelkie zawarte elementy.

Najlepszą praktyką jest umieszczanie komunikatu o błędzie jako jednostki w treści odpowiedzi HTTP - czy to JSON, zwykły tekst, sformatowany HTML, czy jakikolwiek inny format, którego możesz chcieć użyć.

Postrzeganie
źródło
24

Lepiej jest mieć szczegóły błędu w treści. Ponadto wiele (większość / prawie wszystkie, np. WSGI) serwerów i klientów nie obsługuje zmiany nazwy kodu błędu - traktuj je jako ustalone pary (np. 400 to zawsze „Złe żądanie”, a nie „Złe żądanie - Ty Zapomniałem określić identyfikator użytkownika ”). Nawet jeśli się nie zepsują, nie obchodzi ich Twoja specjalna nazwa dla określonego kodu błędu.

Tadeck
źródło
3

Błąd nie należy do treści. Należy do nagłówka Warning.

Ogólny nagłówek HTTP Warning zawiera informacje o możliwych problemach ze statusem wiadomości.

Odniesienie

B Seven
źródło
3
Byłoby miło użyć do tego „oficjalnego” nagłówka. Jednak, Warningjak sama nazwa wskazuje, nie jest dla błędów. Dokument RFC (7234) mówi:> Użycie ostrzeżenia zamiast kodu statusu błędu odróżnia te odpowiedzi od prawdziwych awarii.
Frans
1
Uwaga: nagłówek Warning wkrótce zostanie wycofany; zobacz Ostrzeżenie ( github.com/httpwg/http-core/issues/139 ) i Ostrzeżenie: nagłówek & stale-while-revalidate ( github.com/whatwg/fetch/issues/913 ), aby uzyskać więcej informacji.
Bizmarck