API REST codes d'erreur de retour de la structure
Je suis en train d'écrire une API REST et je suis tombé sur un problème. Quelle est la meilleure façon de retourner les erreurs de validation.
Jusqu'à maintenant, j'ai été de retour les messages d'erreur sous-évaluées en général code d'erreur (disons mauvais demander par exemple)
{
"status": 400,
"error": {
"code": 1, //General bad request code
"message": [
"The Key \"a\" is missing",
"The Key \"b\" is missing",
"The Key \"c\" is missing",
"Incorrect Format for field \"y\""
]
}
)
J'ai fait des recherches un peu plus à propos de comment faut-il une bonne API réponse devrait ressembler et j'ai pensé à l'une des options suivantes:
-
Arrêter à la première erreur rencontrée et de renvoyer une réponse avec le code d'erreur spécifique
{ "status": 400, //Same as the HTTP header returned "error" { "code": 1, //Specific field validation error code "message": "Field \"x\" is missing from the array structure", "developer_message": "The request structure must contain the following fields {a,b,c{x,y,z}}", "more_info" => "www.api.com/help/errors/1" } )
-
Analyser toutes les données de la demande et le retourner plusieurs erreurs de validation.
{ "status": 400, "error": { "code": 1 //General bad Request code "message": "Bad Request", "developer_message": "Field validation errors." "more_info": "www.api.com/help/errors/1", "error_details": { 0: { "code": 2 //Specific field validation error code "message": "Field \"x\" is missing from the array structure", "developer_message": "The request structure must contain the following fields {a,b,c{x,y,z}}", "more_info": "www.api.com/help/errors/2" }, 1: { "code": 3 //Specific field validation error code "message": "Incorrect Format for field \"y\"", "developer_message": "The field \"y\" must be in the form of \"Y-m-d\"", "more_info": "www.api.com/help/errors/3" } } } }
À mon avis, l'option 2 serait le droit chemin (il donne les informations les plus utiles pour les développeurs/utilisateurs finaux et de la charge du serveur peut être plus faible(moins de demandes/pas besoin de revalider les données valides/pas besoin de calculer la signature et l'authentification de l'utilisateur)), mais je suis errant quelles sont les meilleures pratiques, et si il y a une autre façon de traiter ce genre de problèmes.
Aussi je pense que l'option 1 est toujours valable si je reçois une seule erreur fatale dans le flux du script.(pas d'erreurs de validation)
Veuillez noter que le code est juste un simple tableau de sorte qu'il est plus facile à suivre. La réponse format JSON ou XML.
- Je voudrais savoir si quelqu'un est allé #2 et peut-être avoir des améliorations sur elle alors j'ai ouvert un bounty.
- Qu'est-ce que cette API utilisé pour et quel serait le but des messages d'erreur? Ces messages seront affichés à l'utilisateur final ou pas? Combien de demandes de faire attendre par seconde/minutes/jour? La réponse à votre question ne peut pas être précis sans cette info. Tu n'avais pas de réponses, car la question est trop large, cela dépend vraiment de l'utilisation de l'API.
Vous devez vous connecter pour publier un commentaire.
Regardons à Facebook de l'API Graphique. C'est de frapper fort, et un grand nombre d'erreurs sont les plus susceptibles de générer. Voici ce que Facebook renvoie sur une erreur de l'API:
Ils essaient de faire de l'API Graphique aussi utile que possible, mais ils semblent renvoyer une erreur spécifique avec un code et un sous-code (Ref). Le fait que chaque erreur a son propre code signifie qu'il est plus facile de rechercher dudit code ou un message en tant que point de départ pour le débogage. C'est probablement pourquoi ils n'accumule pas les messages d'erreur dans leur programme officiel de réponse d'erreur. Si c'est assez bon et pratique pour Facebook, il est probablement assez bon pour nous.
Exemple de réponses d'erreur:
et
Puis il y a JSend qui "est un cahier des charges qui fixe des règles pour combien de réponses JSON à partir de serveurs web doit être mis en forme." Leur but est:
Voici un exemple de message d'erreur:
Il ressemble à Facebook et de ce groupe essayant de la définir comme un standard de l'industrie sont en optant pour votre choix #1.
Bounty Question
En réponse à la générosité demande de "si quelqu'un est allé #2 et a peut-être des améliorations sur elle?", il est un modèle de conception de Pragmatique API RESTful que les états:
J'ai utilisé #2 moi-même à quelques reprises. Est-il mieux que le #1? Je pense que ça dépend de ce que votre API est utilisé.
J'aime #2, car il donne un développeur qui est de tester l'API avec quelques appels de test un aperçu rapide de toutes les erreurs qu'il a fait en une demande, de sorte qu'il sait immédiatement les erreurs/erreurs qu'il a à résoudre à en faire la demande valide. Si vous retournez les erreurs une par une (comme en #1) vous devez conserver réessayer la demande et de croiser les doigts en espérant qu'il sera valide cette fois.
Mais comme je l'ai dit #2 est très utile pour les développeurs, mais les raisons ne s'applique pas aux utilisateurs finaux. Les utilisateurs finaux n'ont pas l'habitude de soins de la façon dont il est mis en œuvre. Si le logiciel est en train de faire 1 demande, qui renvoie 5 erreurs ou 5 les demandes ultérieures de retour 1 erreur de chacun.
Tant que c'est bien gérée dans le client, l'utilisateur final ne devriez pas remarquer la différence. Comment gérer que, bien sûr, beaucoup dépend de ce que le client en fait est.
Suivant pour accélérer le développement, un autre avantage de la n ° 2 (en production), c'est qu'il nécessite moins de demandes, ce qui bien sûr diminue la charge sur le serveur.
Sûr qu'il y a des améliorations à faire. Comme il est, il y a certaines données dans le corps qui peut être omis.
Avec les réponses HTTP, le code de statut ne devrait pas aller dans le corps, mais dans l'en-tête. Cela signifie que
"status": 400
et"message": "Bad Request"
peut être omis ici. 400 doit être la réponse du code d'état, et de 400 signifie Bad Request. C'est un HTTP standard et n'a pas à être expliqué dans la réponse. Aussi"developer_message": "Field validation errors."
est une sorte de double, puisque les erreurs spécifiques sont déjà inclus dans chaque séparée d'erreur, de sorte que nous pourrions laisser ça.Qui laisse
Ces 2 lignes ne sont pas vraiment plus aucun sens maintenant. Ils ne sont pas nécessaires, étant donné que chaque erreur a ses propres codes et lien d'information, de sorte que nous pourrions bande de ces lignes, en laissant cette
Les 400 code d'état indique qu'il y a une erreur, de sorte que vous n'avez pas à indiquer
"error": {error details}
plus, parce que nous savons déjà, il y avait une erreur. La liste des erreurs peuvent tout simplement devenir l'objet racine:Donc tout ce qui reste dans le corps maintenant est tout simplement une liste des erreurs.
Le code d'état est spécifié dans l'en-tête de réponse.
Les détails sont précisés dans le corps de la réponse.
J'ai récemment travaillé à l'encontre d'une API Rest qui retourne plusieurs avertissements ou des erreurs dans les résultats. À partir de votre Échantillon n ° 2, je voudrais la modifier comme suit:
Ce serait de vous fournir la capacité de fournir des résultats, avec de multiples avertissements ou des erreurs que nécessaire pour votre réponse.
Et oui, ce ne sont quelques ballonnement dans la structure, mais il fournit également une interface facile pour un développeur de toujours récupérer leurs données dans la même structure.
Je voudrais aussi supprimer les éléments suivants comme à mon humble avis, ils devraient être dans l'API docs (comment trouver de l'aide à l'aide d'un code d'erreur) au lieu de sur chaque erreur:
Le long de ces mêmes lignes, je ne suis pas sûr si vous devez à la fois le message et developer_message. Ils semblent être redondant et, comme si vous essayez de fournir à l'utilisateur des messages d'erreur de l'API lorsque l'appelant a omis de fournir les données correctement.
Tout d'abord, vous aurait fourni de la documentation pour le Reste méthodes de l'API pour les clients. Donc, il est attendu du client/développeur de fournir des données valides pour les paramètres.
Maintenant, après avoir dit que n ° 1 est le meilleur moyen de faire des API Rest. Une responsabilité du développeur est de réduire l'utilisation de serveur dans la mesure du possible. Donc, si vous rencontriez une erreur fatale, de Construire une réponse avec le code d'erreur et le message d'erreur et le retourner.
Par ailleurs, nous ne pouvons être sûrs qu'il y a plus d'erreurs après celui que nous avons rencontré. Donc, il n'y a pas de point dans l'analyse du reste des données. Il ne fonctionnera pas bien si l'on considère le pire des cas.
Personnellement, je donnerais les utilisateurs de moins de détails et soit dump erreurs nécessaires pour les développeurs dans une base de données de la table des journaux ou des journaux système. En raison du fait que vous êtes en utilisant JSON et qui est la plus répandue sur les serveurs Apache et votre code semble être du php (mais votre exemple de code avec des accolades pourrait être un certain nombre de langues originaires de PASCAL par exemple. C, C#, PERL, PHP, C#). Voici comment mettre de sortie personnalisé des erreurs dans les logs du système si vous ne connaissez pas déjà comment en php http://php.net/manual/en/function.syslog.php . Si vous utilisez un des plus rares de configuration de IIS JSON et CSharp il y a des .Bibliothèques NET pour faire de semblable aussi. Si vous donnez à vos utilisateurs trop d'informations lorsqu'une erreur se produit vous êtes aussi en donnant un hacker dans le futur, une façon de sonder votre site web.
De l'API ne sont pas pour les humains. Vous n'avez donc pas besoin de retourner d'erreur détaillé des textes. Vous pouvez même retourner un code d'erreur qui signifie "paramètre manquant". Il suffit de ne pas oublier de document, c'est bien.