La norme API JSON format de la réponse?
Faire de normes ou de pratiques exemplaires pour la structuration des réponses JSON à partir d'une API? Évidemment, toutes les données de l'application est différente, de sorte que beaucoup ne me concerne pas, mais plutôt la réponse "standard", si vous voulez. Un exemple de ce que je veux dire:
Succès de la demande:
{
"success": true,
"payload": {
/* Application-specific data would go here. */
}
}
Échec de la demande:
{
"success": false,
"payload": {
/* Application-specific data would go here. */
},
"error": {
"code": 123,
"message": "An error occurred!"
}
}
- Les gens ont probablement appris de SAVON et de ne pas construire de nouveau...
- Soin d'expliquer votre commentaire?
- XML a été, à mon avis, tués pour les programmeurs par un excès de normalisation qui en résulte dans le ballonnement de l'API et des applications, conduisant finalement à presque jamais, aujourd'hui, faire du SAVON à la simple original quelques LOC façon, mais avec la lenteur des bibliothèques, de paramétrage et même le code de la construction des cadres... je suis sûr que la plupart aujourd'hui, les concepteurs ne veulent pas avoir le même cauchemar se produise. Mais c'est juste un avis et je ne veux pas le sol de votre question avec plus de coup de gueule à l'odeur des commentaires.
- J'étais vraiment intéressé par cette question, comme j'ai eu à concevoir une API JSON récemment et me demandais si elles étaient toutes les normes de la définition d'un format de réponse. La vôtre en fait est très joli et semble à la peine de l'utiliser si vous ne trouvez pas un standard. C'est une honte que les réponses fournies ne sont pas réellement répondre à la question.
- malheureusement, c'est parce que peu importe où vous allez, il n'y a pas de norme. Non seulement au sein de JSON lui-même, mais en termes de son utilisation pour les applications Reposant, ou toute autre chose de la sorte. Tout le monde le fait différemment. Vous pouvez vous sentir libre de suivre les meilleures pratiques (HTTP-réponses, gamme étoffée de la structure, un œil vers la structuration de vos données à des fins de consommation par votre système), mais tous, qui est un important distributeur est en train de faire au moins une chose différente que les autres... Il n'y a pas de norme, et il ne sera probablement pas un, afin de construire quelque chose de solide, et de le construire pour s'adapter à vous.
- il existe des normes (voir ma réponse). En fait, La bonne chose à propos des normes, c'est que vous avez donc beaucoup à choisir de. - Andrew Tanenbaum
- Et pourtant, aujourd'hui, il y RESTE.
- Le REPOS est absolument contrairement au SAVON. De REPOS et de ne pas normaliser JSON à tous.
- Peut-être que j'ai mal compris votre diatribe. L'OP a une question sur 'la structuration des réponses JSON à partir d'une API". JSON est en grande partie remplacé le XML, et bien que je ne suis pas sûr de REPOS uniformise les réponses eux-mêmes, il ne standardiser les Api web, dans un cadre beaucoup moins cauchemardesque façon que XML n'. Dans les projets impliquant de nombreux ingénieurs, c'est agréable quand il y a un standard, tout le monde peut suivre, et je souhaite qu'il y ait une pour les réponses. J'essaie d'écrire réutilisables code client, et lors de la vérification de pour HTTP 200 est assez facile, je suis souvent frustré par l'inconsistance des structures dans des réponses d'erreur, que je voudrais journal.
- xkcd.com/927
- Très bonne question. Nous avons d'abord utilisé des objets dynamiques en C# et rapidement, il est difficile de savoir ce que les données ont été. Votre présentés idée ressemble en fait assez bon niveau.
- cela devrait vraiment aller à des logiciels ingénieur parce que c'est plus opiniâtres.
- Les "normes" mentionné dans les bagages de réponse sont horribles (ballonnement, incompréhensible), celui que vous avez est celui que j'utilise aussi. Peut-être nous tous à l'aide de collecter et de publier notre propre standard.
Vous devez vous connecter pour publier un commentaire.
Oui, il ya un couple de normes (quoique quelques libertés sur la définition de la norme) qui ont émergé:
Il y a aussi des API JSON formats de description:
{"success": false, ...
, jQuery va encore courir.success(function(){})
de rappel? droit?Google JSON guide
Réponse de réussite de retour
données
Réponse d'erreur de retour
error
et si votre client est en JS, vous pouvez à l'aide de
if ("error" in response) {}
pour vérifier si il y a erreur.error
, la page de Google donne un exemple de cetteredirect
devrait être surdata
ouerror
?Je suppose un standard de facto n'a pas vraiment vu le jour (et peut-être jamais).
Mais peu importe, ici, c'est mon point de vue:
Succès de la demande:
Échec de la demande:
Avantage: les Mêmes éléments de niveau supérieur dans les deux succès et en cas d'erreur
Inconvénient: Pas de code d'erreur, mais si vous le souhaitez, vous pouvez soit changer de statut pour être un (succès ou échec) du code, ou vous pouvez ajouter un autre élément de niveau supérieur nommé "code".
messages
qui est un tableau de messages au lieu d'une seule chaîne.fail
pour les problèmes de validation, tandis queerror
est utilisé uniquement avec comme fatale comme db erreurs.200
dans les en-têtes pourquoi avez-vous encore besoin d'unstatus
champ? juste retour de l'objet de données directement. Vous savez ce qui peut provoquer des douleurs avec tapé FE langues comme des caractères d'imprimerie.En supposant que vous avez une question RESTE services web design, et plus précisément concernant la réussite ou de l'erreur.
Je pense qu'il y a 3 différents types de design.
Utilisation seulement le code d'État HTTP pour indiquer si il y a une erreur et essayez de vous limiter à la norme chers (en général, il devrait suffire).
Utilisation HTTP État + json corps (même si c'est une erreur). Définir une structure uniforme pour les erreurs (ex: code, message, motif, type, etc) et les utiliser pour les erreurs, si c'est un succès, puis il suffit de retourner l'attend réponse json.
Oublier le code d'état http (ex: toujours le statut de 200), toujours utiliser json et les ajouter à la racine de la réponse booléenne responseValid et un objet d'erreur (code,message,etc) qui sera remplie si c'est une erreur sinon les autres champs (succès) sont remplis.
Pros: Le client traite avec le corps de la réponse qui est une chaîne json et ignore l'état(?).
Inconvénients: Le moins standard.
C'est à vous de choisir 🙂
Selon l'API, je voudrais choisir 2 ou 3 (je préfère le 2 json api rest).
Une autre chose que j'ai expérimenté dans la conception d'Api REST est l'importance de la documentation pour chaque ressource (url): les paramètres, le corps, la réponse, les en-têtes, etc + des exemples.
Je voudrais vous recommandons également d'utiliser jersey (jax-rs de mise en œuvre) + genson (java/json de la liaison de données de la bibliothèque).
Vous n'avez qu'à déposer genson + maillot dans votre classpath et json est automatiquement pris en charge.
EDIT:
La Solution 2 est la plus difficile à mettre en œuvre, mais l'avantage est que vous pouvez bien gérer les exceptions et pas seulement le commerce des erreurs, d'effort initial est plus important, mais vous gagner sur le long terme.
Solution 3 est facile à mettre en œuvre sur les deux, côté serveur et client, mais il n'est pas si beau que vous aurez à encapsuler les objets que vous souhaitez retourner dans un objet de réponse contenant également de la responseValid + erreur.
Je ne vais pas être aussi arrogant de prétendre que c'est un standard, donc je vais utiliser le "je préfère" forme.
Je préfère réponse laconique (lors de la demande d'une liste de /articles je veux un tableau JSON des articles).
Dans mes dessins j'utilise HTTP pour le rapport, un 200 retourne juste la charge utile.
400 renvoie un message de ce qui n'allait pas avec la demande de l':
Retour 404 si le modèle/contrôleur/URI n'existe pas
Si il y a erreur de traitement de mon côté, je retourne 501 avec un message:
De ce que j'ai vu assez peu de REPOS-ish cadres ont tendance à être le long de ces lignes.
Justification:
JSON est censé être un charge utile format, ce n'est pas un protocole de session. L'idée de verbose session-ish charges provient du XML/SOAP monde et de divers mauvais choix qui a créé ces pléthorique de modèles. Après nous avons réalisé tout cela était un gros mal de tête, le point de l'ensemble de REST/JSON a été à la BAISER, et d'adhérer à HTTP. Je ne pense pas qu'il y est quelque chose à distance standard dans JSend et surtout pas avec le plus de commentaires parmi eux. XHR va réagir à la réponse HTTP, si vous utilisez jQuery pour votre AJAX (comme la plupart le font), vous pouvez utiliser
try
/catch
etdone()
/fail()
rappels à des erreurs de saisie. Je ne vois pas comment l'encapsulation des rapports d'état en JSON est plus utile que ça.Suivant est le format json instagram est à l'aide de
La RFC 7807: les Détails du Problème pour Api HTTP est pour le moment la chose la plus proche que nous avons à une norme officielle.
Pour ce que ça vaut je le fais différemment. Un appel réussi a juste les objets JSON. Je n'ai pas besoin d'un niveau plus élevé d'objet JSON qui contient un succès champ indiquant le vrai et une charge utile de domaine qui est l'objet JSON. Je viens de renvoyer le approprié d'objet JSON avec un 200 ou tout ce qui est approprié dans les 200 pour la HTTP statut dans l'en-tête.
Cependant, si il y a une erreur (quelque chose dans le 400 de la famille) - je retourner un bien formé JSON objet d'erreur. Par exemple, si le client est l'Affichage d'un Utilisateur avec une adresse e-mail et numéro de téléphone et l'une d'elles est mal formé (c'est à dire je ne peux pas l'insérer dans ma base de données sous-jacente), je vais retourner quelque chose comme ceci:
Important bits voici que le "domaine" de la propriété doit correspondre au champ JSON exactement ce que pourrait ne pas être validé. Cela permet aux clients de savoir exactement ce qui s'est passé avec leur demande. Aussi, "message" est dans les paramètres régionaux de la demande. Si les deux "emailAddress" et "numéro de téléphone" n'étaient pas valides alors que les "erreurs" tableau contient des entrées pour les deux. Un 409 (Conflit) réponse JSON corps pourrait ressembler à ceci:
Avec le code d'état HTTP et JSON le client a tous ils ont besoin pour répondre à des erreurs dans la façon déterministe, et il ne crée pas une nouvelle erreur standard qui essaye de compléter remplacer les codes d'état HTTP. Remarque, ces se produire uniquement pour la gamme de 400 erreurs. Pour quoi que ce soit dans les 200, je peux juste retour de tout ce qui est approprié. Pour moi, c'est souvent une couche HAL-comme objet JSON, mais qui n'a pas vraiment d'importance ici.
La seule chose que j'ai pensé ajouter a un code d'erreur numérique, soit en les "erreurs" tableau des entrées ou la racine de l'objet JSON lui-même. Mais jusqu'à présent, nous n'avons pas besoin d'elle.
Leur est pas d'accord sur le reste de l'api des formats de réponse de big logiciel géants Google, Facebook, Twitter, Amazon et d'autres, bien que de nombreux liens ont été fournis dans les réponses ci-dessus, où certaines personnes ont essayé de standardiser le format de la réponse.
À mesure que les besoins de l'API peuvent différer, il est très difficile de mettre tout le monde à bord et en accord avec le format. Si vous avez des millions d'utilisateurs à l'aide de votre API, pourquoi voulez-vous changer votre format de la réponse?
Suivante est mon point de vue sur le format de la réponse inspirée par Google, Twitter, Amazon et certains messages sur internet:
https://github.com/adnan-kamili/rest-api-response-format
Swagger fichier:
https://github.com/adnan-kamili/swagger-sample-template
Le point de JSON est qu'il est totalement flexible et dynamique. Plier à quelque caprice vous le souhaitez, car il est juste un ensemble de sérialisé JavaScript les objets et les tableaux, enracinée dans un seul nœud.
Ce que le type de la rootnode est à vous, ce qu'il contient est à vous, si vous envoyez des méta-données avec la réponse est à vous, si vous définissez le type mime
application/json
ou le laisser teltext/plain
est à vous (et aussi longtemps que vous savez comment gérer les cas de bord).Construire un léger schéma que vous aimez.
Personnellement, j'ai trouvé que l'analyse, de suivi et de mp3/ogg servir et image-galerie de servir et de messagerie et de réseau de paquets pour les jeux en ligne, et blog-posts et blogs-commentaires tous ont des exigences très différentes en termes de ce qui est transmis et ce qui est reçu et comment ils doivent être consommés.
Donc la dernière chose que je veux, quand vous faites tout cela, c'est d'essayer de rendre chacun se conformer à la même passe-partout standard, qui est basé sur XML2.0 ou somesuch.
Cela dit, il ya beaucoup à dire pour l'utilisation des schémas qui font sens pour vous et sont bien pensé.
Tout simplement lire un API réponses, notez ce que vous aimez, critiquer ce que vous ne le faites pas, écrire ces critiques vers le bas et de comprendre pourquoi ils frotter dans le mauvais sens, et ensuite réfléchir à la façon d'appliquer ce que vous avez appris de ce que vous avez besoin.
JSON-RPC 2.0 définit un standard de demande et de réponse format, est une bouffée d'air frais après avoir travaillé avec des Api REST.
code
champ à une Chaîne. Heureusement que la norme permet de nous farcir toutes les informations que nous voulons dans l'erreur dedata
champ. Dans mon JSON-RPC projets j'utilise généralement un seul code numérique pour tous à l'application de la couche d'erreurs (par opposition à celui de la norme erreurs de protocole). Puis j'ai mis les informations détaillées sur l'erreur (y compris une chaîne de code indiquant la véritable erreur type) dans ladata
champ.Le cadre de base suggéré l'air bien, mais l'erreur de l'objet défini est trop limitée. Souvent, on ne peut pas utiliser une valeur unique pour exprimer le problème, et au lieu d'un la chaîne des problèmes et des causes est nécessaire.
J'ai fait une petite recherche et constaté que le format le plus courant pour le retour d'erreur (exceptions) est une structure de cette forme:
C'est le format proposé par l'OASIS de données standard OASIS OData et semble être le plus standard option là-bas, cependant, il ne semble pas être élevé, les taux d'adoption d'une norme à ce point. Ce format est compatible avec le JSON-RPC spécification.
Vous pouvez trouver l'open source complète de la bibliothèque qui implémente ce à: Mendocino JSON Utilitaires. Cette bibliothèque prend en charge les Objets JSON ainsi que les exceptions.
Les détails sont discutés dans mon billet de blog sur Gestion des erreurs en JSON API REST
Concernant votre deuxième exemple, le JSON spécification de l'interdit:
Meilleure Réponse pour les api web qui peut facilement comprendre par les développeurs d'applications mobiles.
C'est pour la "Réussite" de la Réponse
C'est pour les "Erreur" Réponse