Je crée une API RESTful qui traitera un certain nombre d'interactions utilisateur, y compris la passation de commandes à l'aide de cartes de crédit stockées.
Dans le cas d'une commande réussie, je retourne un 200 OK, et dans le cas où la demande de commande est mal formée ou invalide, je retourne une 400 Bad Request. Mais que dois-je retourner en cas de problème lors du traitement proprement dit de la commande?
- Le client POST une commande au serveur pour une ressource utilisateur. Si l'utilisateur n'existe pas, 404 Not Found est renvoyé.
- Le format et les informations de la commande sont validés. Si non valide, 400 Bad Request est renvoyé.
- La commande est traitée. Si la commande est réussie, un 201 Created est retourné pour la commande. Si une erreur inattendue se produit, une erreur de serveur 500 est renvoyée.
La dernière étape est le problème - que dois-je retourner si la commande ne se termine pas pour une autre raison? Les scénarios possibles pourraient inclure:
- Le produit est épuisé
- Limite de commande maximale de l'utilisateur atteinte
- Échec de la transaction par carte de crédit (fonds insuffisants, etc.)
Cela ne semble pas approprié pour un 400 ou un 500. Si quoi que ce soit, je pourrais le voir comme un 400 s'il n'y a pas de meilleur code - la demande était invalide selon les règles métier. Cela ne semble tout simplement pas exact.
Edit: a également trouvé cette discussion existante sur le même sujet. Toutes les réponses semblent indiquer l'utilisation de codes d'état pour ce type de violation, avec une discussion entre l'utilisation de l'extension 400, 409 ou 422.
la source
Réponses:
Vous devez utiliser 400 pour les règles métier. Ne retournez pas 2xx si la commande n'a pas été acceptée. HTTP est un protocole d'application, ne l'oubliez jamais. Si vous retournez 2xx, le client peut supposer que la commande a été acceptée, quelles que soient les informations que vous envoyez dans le corps.
À partir du livre de recettes des services Web RESTful :
Je vous laisse le soin de choisir entre 4xx et 5xx, mais vous devriez utiliser un code d'état d'erreur.
la source
Vous devez utiliser 4xx pour une erreur client si le client peut modifier la demande pour contourner l'erreur. Utilisez un 5xx pour une erreur de serveur que le client ne peut pas vraiment contourner.
Le produit épuisé serait une erreur de serveur. Le client ne peut pas modifier la demande d'une manière ou d'une autre pour contourner l'erreur. Vous pourriez passer à un autre produit mais ne serait-ce pas une nouvelle demande?
La limite de commande maximale de l'utilisateur atteinte est également une erreur de serveur. Rien que le client ne peut faire pour contourner cette erreur.
L'échec de la transaction par carte de crédit serait une erreur du client. Le client peut resoumettre la demande avec un autre mode de paiement ou numéro de carte de crédit pour contourner l'erreur.
la source
Type d'erreur:
Code d'erreur:
Le serveur comprend le type de contenu de l'entité de demande (par conséquent, un code d'état 415 Type de support non pris en charge est inapproprié), et la syntaxe de l'entité de demande est correcte (donc un code d'état 400 Bad Request est inapproprié) mais n'a pas pu traiter le contenu instructions.
Par exemple, cette condition d'erreur peut se produire si un corps de requête XML contient des instructions XML bien formées (c'est-à-dire syntaxiquement correctes), mais sémantiquement erronées.
https://httpstatuses.com/422
la source
Je sais que cette question est ancienne, mais j'ai posé la même question aujourd'hui. Si mon utilisateur n'a plus de crédits, quel code de statut doit renvoyer mon API REST?
J'ai tendance à me pencher vers
402 Payment Required
:Selon Wikipedia :
Et en effet, ils font :
la source
Et pourquoi pas
424 Failed Dependency
? La spécification le décrit comme:Mais il y a aussi cette définition :
Vous pouvez dire au client (ou faire semblant) que vous avez des actions internes qui sont censées créer la commande et déduire le solde, et que l'une de ces actions a échoué, bien que pour des raisons parfaitement valables, et c'est pourquoi la demande a échoué.
Pour autant que je sache, «action» est un terme assez large et peut être utilisé dans diverses situations, notamment un stock insuffisant, un crédit insuffisant ou une soirée entrepôt.
Une autre option pourrait être
422 Unprocessable Entity
:Tenter de demander un article en rupture de stock, ou lorsque votre crédit est insuffisant, peut être considéré comme une erreur au niveau sémantique.
MozDev dit que cela indique une erreur du côté client, en particulier: Le client ne doit pas répéter cette demande sans modification.
Le bouclage 4 utilise 422 lorsque la validation d'entrée échoue.
On peut soutenir qu'un stock insuffisant ou une nuit dans l'entrepôt pourraient être considérés comme des états temporaires, de sorte que la demande pourrait être réessayée plus tard. Cette situation peut être indiquée par
503 Service Unavailable
la source
Je ne pense pas que 400 puisse être utilisé pour tous les scénarios commerciaux. Il peut être utilisé pour la validation d'entrée de données de base. Au-delà de cela, nous pourrions avoir du mal à intégrer une autre logique métier dans ce code d'erreur. Les erreurs gérées par ceci sont principalement des erreurs de conception que le développeur rencontrera éventuellement lors du codage du client.
Disons que tous les paramètres sont corrects et disons que nous transmettons le numéro de compte utilisateur dans la requête.
La requête n'est donc plus une mauvaise requête, le serveur est capable d'accepter la requête. Mais maintenant, il refuse de répondre à la demande sur la base des nouvelles informations disponibles, ce qui est - le compte n'a pas un solde suffisant.
Je suggérerais que nous devrions utiliser 403 avec un message d'erreur approprié dans ces scénarios.
Un autre code d'erreur possible pourrait être un conflit 409. Mais cela est utilisé dans les scénarios où la ressource est dans un état cohérent.
la source
Je vais avec 406
Not Acceptable
.Voici une liste 4xx:
la source