REST HTTP-statuscodes voor mislukte validatie of ongeldig duplicaat

Ik'm bouw een toepassing met een REST-gebaseerde API en ben op het punt gekomen waar ik'm statuscodes specificeer voor elk verzoek.

Welke statuscode moet ik sturen voor verzoeken mislukte validatie of waar een verzoek probeert toe te voegen een duplicaat in mijn database?

Ik'heb gekeken via http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html maar geen van hen lijkt juist.

Is er een gemeenschappelijke praktijk bij het verzenden van statuscodes?

Oplossing

Voor invoer validatie fout: 400 Bad Request + uw optionele beschrijving. Dit wordt voorgesteld in het boek "RESTful Web Services". Voor dubbel indienen: 409 Conflict


Update juni 2014

De relevante specificatie was voorheen RFC2616, die het gebruik van 400 (Bad Request) vrij beperkt gaf als

Het verzoek kon niet worden begrepen door de server vanwege een misvormde syntaxis

Men zou dus kunnen redeneren dat het ongeschikt was voor semantische fouten. Maar nu niet meer; sinds juni 2014 geeft de relevante standaard RFC 7231, die de vorige RFC2616 vervangt, het gebruik van 400 (Bad Request) ruimer als

de server kan of zal het verzoek niet verwerken vanwege iets dat wordt opgevat als een fout van de client

Commentaren (11)
  • Mislukte validatie: 403 Forbidden ("De server heeft het verzoek begrepen, maar weigert het uit te voeren"). In tegenstelling tot wat vaak wordt gedacht, zegt RFC2616 niet "403 is alleen bedoeld voor mislukte authenticatie", maar "403: Ik weet wat je wilt, maar ik zal'dat niet doen". Die voorwaarde kan al dan niet het gevolg zijn van authenticatie.
  • Ik probeer een duplicaat toe te voegen: 409 Conflict ("Het verzoek kon niet worden voltooid vanwege een conflict met de huidige status van de bron.")

Je moet zeker een meer gedetailleerde uitleg geven in de response headers en/of body (bijv. met een custom header - X-Status-Reason: Validation failed).

Commentaren (19)

Ik adviseer statuscode 422, "Unprocessable Entity".

11.2. 422 Onverwerkbare Entiteit

De statuscode 422 (Unprocessable Entity) betekent dat de server het inhoudstype van de request entiteit begrijpt (vandaar dat een 415(Unsupported Media Type) statuscode ongepast is), en dat de syntax van de request entiteit correct is (vandaar dat een 400 (Bad Request) statuscode ongepast is), maar niet in staat was om de instructies in de request entiteit te verwerken. Deze foutconditie kan zich bijvoorbeeld voordoen indien een XML-verzoek welgevormde (d.w.z. syntactisch correcte), maar semantisch foutieve XML-instructies bevat.

Commentaren (14)