REST HTTP-statuskoder for mislykket validering eller ugyldig duplikat

Jeg bygger en applikasjon med et REST-basert API og har kommet til et punkt der jeg spesifiserer statuskoder for hver forespørsel.

Hvilken statuskode skal jeg sende for forespørsler som ikke blir validert, eller der en forespørsel prøver å legge til et duplikat i databasen min?

Jeg har sett gjennom http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html, men ingen av dem virker riktige.

Finnes det en felles praksis for sending av statuskoder?

Løsning

For feil ved inndatavalidering: 400 Bad Request + valgfri beskrivelse. Dette er foreslått i boken "RESTful Web Services". For dobbel innsending: 409 Conflict


Oppdatert juni 2014.

Den relevante spesifikasjonen pleide å være RFC2616, som ga bruk av 400 (Bad Request) ganske snevert som

Forespørselen kunne ikke forstås av serveren på grunn av feil syntaks.

Så det kan ha blitt hevdet at det var upassende for semantiske feil. Men ikke nå lenger; siden juni 2014 har den relevante standarden RFC 7231, som erstatter den tidligere RFC2616, gitt bruken av 400 (Bad Request) mer bredt som

serveren kan ikke eller vil ikke behandle forespørselen på grunn av noe som oppfattes å være en klientfeil

Kommentarer (11)
  • Valideringen mislyktes: 403 Forbidden ("Serveren forsto forespørselen, men nekter å oppfylle den"). I motsetning til hva mange tror, sier ikke RFC2616 at "403 bare er ment for mislykket autentisering", men "403: Jeg vet hva du vil, men jeg vil ikke gjøre det&quot. Denne tilstanden kan skyldes autentisering eller ikke.
  • Prøver å legge til et duplikat: 409 Konflikt ("Forespørselen kunne ikke fullføres på grunn av en konflikt med ressursens nåværende tilstand.&quot).

Du bør absolutt gi en mer detaljert forklaring i svaroverskriftene og/eller brødteksten (f.eks. med en egendefinert overskrift - X-Status-Reason: Validation failed).

Kommentarer (19)

Jeg anbefaler statuskode 422, "Unprocessable Entity".

11.2. 422 Enhet som ikke kan behandles

Statuskoden 422 (Unprocessable Entity) betyr at serveren forstår innholdstypen til forespørselsenheten (derfor er en 415 (Unsupported Media Type) statuskode upassende), og syntaksen til forespørselsenheten er riktig (derfor er en 400 (Bad Request) statuskode upassende), men var ikke i stand til å behandle instruksjonene i den. Denne feiltilstanden kan for eksempel oppstå hvis en XML-forespørsel inneholder velformede (dvs. syntaktisk korrekte), men semantisk feilaktige XML-instruksjoner.

Kommentarer (14)