Précisez-le. Rapport Yandex

Une bonne spĂ©cification API aide les clients Ă  l'utiliser. Il y a quelques mois chez Big Pytup, le dĂ©veloppeur Yandex Alexander Bryazginbryazginnna fait une prĂ©sentation sur quoi la spĂ©cification de l'API REST est basĂ©e sur un exemple d'OpenAPI + Swagger et pourquoi un tel bundle est nĂ©cessaire. À partir du synopsis, vous pouvez dĂ©couvrir comment nous avons foirĂ© la gĂ©nĂ©ration automatique de la spĂ©cification dans le service fini, quelles bibliothĂšques nous ont Ă©tĂ© utiles et quel type de rĂ©glage est autour de la spĂ©cification OpenAPI.


- Bonjour à tous, mon nom est Alexander. Je voudrais vous parler des spécifications.



Plus précisément, je voudrais aborder plusieurs sujets. Tout d'abord, quelles sont les spécifications en utilisant l'exemple des spécifications de l'API REST. De plus - comme nous avons accéléré la génération des spécifications dans notre service. Et à la fin, du bon cÎté - quels outils, réglage, pour utiliser les résultats de notre génération de spécifications, en utilisant un exemple d'une telle spécification comme OpenAPI et Swagger UI.

Spécifications de l'API REST


Quelles sont les spécifications et qu'est-ce que j'entends par là dans mon rapport?



Tout d'abord, c'est l'Interface Description Language, un langage pour dĂ©crire les interfaces, une description qui correspond Ă  un format spĂ©cifique. Il peut ĂȘtre analysĂ© automatiquement, car il a un format strict et des spĂ©cificitĂ©s telles qu'il ne dĂ©pend pas de la langue elle-mĂȘme dans laquelle l'interface est implĂ©mentĂ©e. Autrement dit, disons que vous avez un serveur Web Python, pour le langage de description d'interface, cela n'a pas d'importance.

Il existe de nombreuses langues pour spécifier les spécifications. Ce sont des spécifications pour REST, RPC, GraphQL, etc. Aujourd'hui, nous allons nous attarder sur la spécification REST.

Openapi


Parlons des spécifications en utilisant l'exemple OpenAPI.



Tout d'abord, comprenons ce qu'est OpenAPI. Il s'agit du mĂȘme langage pour dĂ©crire les spĂ©cifications. En soi, il s'agit d'un fichier - au format YAML, JSON ou XML, qui l'aime le plus - avec une description de l'interface, des poignĂ©es des points de terminaison et des schĂ©mas.

Swagger


Quand on parle d'OpenAPI, on ne peut pas dire de Swagger.



Swagger est essentiellement une interface utilisateur OpenAPI qui vous permet de visualiser magnifiquement vos spécifications.



Dans Swagger, comme dans OpenAPI, il y a une description des points de terminaison qui se trouvent dans votre spécification.



Il y a une description de l'autorisation dans votre API.



Il existe une description des modÚles ou des circuits avec lesquels vous manipulez dans votre API - par exemple, acceptez-les pour entrée ou renvoyez-les pour sortie.



Il y a une description des exemples et des demandes et réponses attendues de votre API.



De plus, dans votre Swagger, du fait qu'il s'agit d'une interface utilisateur et qu'il s'exĂ©cute dans votre navigateur, vous pouvez en temps rĂ©el exĂ©cuter des requĂȘtes vers votre API ici et maintenant.


Lien depuis la diapositive

Avec tout cela, vous pouvez jouer sur un banc d'essai préparé par l'équipe Swagger. C'est petstore.swagger.io. Il y a un exemple de spécification, soulevé par Swagger. Vous pouvez accéder au vrai backend et toucher. Recommander.



Donc, nous disons: OpenAPI, Swagger, spécification. Mais pourquoi tout cela est nécessaire pour une personne qui écrit, disons, un backend?

Tout d'abord, les spĂ©cifications sont souvent utilisĂ©es lors de la phase de conception de notre API. Autrement dit, les gens normaux, Ă©tant arrivĂ©s Ă  la tĂąche d'Ă©crire un backend, commencent par dĂ©crire ce qu'ils veulent mettre en Ɠuvre. Autrement dit, ils commencent Ă  concevoir leur API, une liste de points de terminaison qu'ils souhaitent implĂ©menter, une liste de schĂ©mas Ă  manipuler, des paramĂštres, etc. Dans ce cas, les spĂ©cifications et les outils autour des spĂ©cifications sont trĂšs pratiques.

De plus, il existe un cas populaire. Pour ce que nous avons fait glisser la spécification vers nous en service? Ceci est la documentation. La disponibilité des spécifications vous donne une si bonne occasion de décrire votre API et de partager ces informations avec quelqu'un: soit avec les fournisseurs frontaux de votre équipe, soit avec des clients externes qui souhaitent s'intégrer avec vous.

De plus, Ă©tant donnĂ© que la spĂ©cification est Ă©crite dans un certain format strict, elle peut ĂȘtre automatiquement traitĂ©e, c'est-Ă -dire engagĂ©e dans l'introspection de l'API. Et en plus, vous pouvez attraper de nombreux outils qui peuvent vous faciliter la vie. Je vous le dirai plus prĂ©cisĂ©ment et plus en dĂ©tail plus tard.

Comment nous préparons OpenAPI


Nous avons décidé pourquoi nous avions besoin de tout cela. Parlons de la façon dont nous avons bousillé la génération de spécifications dans notre service. Tout d'abord, un peu de contexte.



Lorsque nous sommes arrivés à l'idée de réduire la spécification, nous avons fait fausse route lorsque nous avons écrit le projet, dans le sens d'un prototype avec une spécification. Nous avons déjà soulevé un backend, il volait déjà avec nous, et nous voulions partager la spécification comme moyen de documentation.

Et notre backend était soudainement en Python. Nous avons utilisé Falcon comme cadre, marshmallow comme outil de sérialisation et de désérialisation des données et webargs comme outil de validation.



En utilisant l'extrait le plus simple de l'animalerie que j'ai mentionnĂ© plus tĂŽt, nous imaginerons Ă  quoi pourrait ressembler notre service Ă  l'Ă©tape oĂč nous voulions gĂ©nĂ©rer une spĂ©cification.

Dans notre service, il y aurait une paire simplifiĂ©e de schĂ©mas: le type de notre animal de compagnie, c'est-Ă -dire la catĂ©gorie et, en fait, les animaux eux-mĂȘmes.



Autrement dit, nous décririons plusieurs schémas sur Marshmallow. De plus, nous préparerions quelques stylos afin, par exemple, de vous inscrire et de recevoir nos favoris.



Et, en fait, ils dĂ©criraient l'application elle-mĂȘme, ce qui augmenterait le point final pour la crĂ©ation et la rĂ©ception d'animaux domestiques.



VoilĂ  Ă  quoi cela ressemblerait. Service assez simple.

Réfléchissons aux options dont nous disposons pour créer une configuration OpenAPI. L'option la plus simple et la plus naïve, comme je l'ai dit plus tÎt, n'est qu'un fichier. Pourquoi ne faisons-nous pas ce fichier avec nos mains? Nous savons quelles données d'entrée nous avons, nous avons des points de terminaison. Cela semble évident, il suffit de prendre et d'écrire.



Mais tout d'abord, nous sommes des programmeurs. Nous n'aimons rien faire de nos mains. Nous voulons que quelque chose de standard soit généré pour nous. DeuxiÚmement, si nous prenions tout en charge à la main, nous devrons certainement prendre en charge les modifications d'API, ainsi qu'un fichier qui se trouve ailleurs. Comme tout service, notre produit est volatile, tout comme les spécifications.

Par conséquent, nous sommes arrivés à la conclusion que nous voulons générer une configuration OpenAPI. Compte tenu de notre pile technologique, nous avons trouvé une bibliothÚque comme apispec . Apispec est une bibliothÚque de fabricants, c'est-à-dire les auteurs de Marshmallow et Webargs. Ensemble, ils constituent un vaste écosystÚme.

Voyons comment vous pouvez utiliser apispec sur notre pile pour lui apprendre à générer une spécification pour nous.



Nous avions une ressource et un gestionnaire spécifique pour la méthode get de cette ressource. Il a une sorte de corps.



Pour enseigner l'apispec, pour lui faire savoir ce que nous faisons dans notre stylo, nous ajoutons quelque chose au docstring. Nous y ajoutons une description compréhensible pour l'homme. Dans notre cas, ceci est un exemple de réponses: parfois cela arrive, notre stylo répond avec deux cents, et dans le corps de notre réponse il y a JSON avec un schéma, Pet data model.





En utilisant l'exemple d'une post-requĂȘte, nous dĂ©crivons: en plus du fait qu'il y a une rĂ©ponse 201 dans laquelle nous renvoyons Pet, il y a aussi le corps attendu de la requĂȘte qui nous vient. Et Ă  l'intĂ©rieur de cette demande, nous attendons JSON, et nous attendons Ă  ce que ce JSON soit au format Pet.



Nous avons ajouté des docstrings, puis nous devons apprendre à générer une spécification. Pour ce faire, nous écrivons une sorte de script, un bouton rouge et apprenons à apispec à générer une spécification pour nous. Nous déclarons un objet apispec, à partir duquel nous décrivons quelques métadonnées de notre service, puis écrivons simplement le fichier, la spécification générée au format YAML.

Voyons ce qui a été généré pour cette énorme application dans ce fichier.



Tout d'abord, dans ce fichier, il y aura une description de la version dans laquelle la spécification a été générée. Ceci est important pour que tous ceux qui interprÚtent cette spécification comprennent le format à interpréter. Les spécifications varient d'une version à l'autre.

De plus, il y a une description de notre service. Ce titre, cette version, peut-ĂȘtre y aura-t-il une description, si vous le souhaitez, puis une liste de serveurs vers lesquels vous pourrez vous rendre, tirer les stylos, voir et toucher notre backend.



De plus, les schĂ©mas de donnĂ©es que nous manipulons y poussent, avec une description des types, des exemples de remplissage de ces donnĂ©es et quelques rĂšgles. Ce sont peut-ĂȘtre des valeurs extrĂȘmes, peut-ĂȘtre les paramĂštres de liaison. Vous voyez ici une liste des attributs requis.



En plus des schĂ©mas, la description des points de terminaison eux-mĂȘmes s'y dĂ©veloppe. Dans ce cas, la description de chaque mĂ©thode germe.



En utilisant la méthode get, nous obtenons une description de ce que nous faisons avec la méthode get.



Et exactement la description que nous avons mise dans les docstrings du point de terminaison correspondant a germé sur le post. Autrement dit, nous avons déjà reçu une sorte de fichier.

Qu'allons-nous en faire maintenant? Quelle est l'utilitĂ©? Tout d'abord, vous, en tant que propriĂ©taires du backend, pouvez dĂ©jĂ  donner Ă  tous ces clients potentiels qui iront dans vos stylos, donner cette spĂ©cification. Et cela aidera les gars Ă  s'intĂ©grer. C'est-Ă -dire que le fichier que nous avons gĂ©nĂ©rĂ© ne vous fait pas vous arracher les yeux. C'est assez lisible. Il peut ĂȘtre vu Ă  travers les yeux et analysĂ© d'une maniĂšre ou d'une autre.

Mais c'est aussi difficile. Voyons quels autres outils sont là pour vous simplifier la vie et quel type de réglage est autour de la spécification générée.

Brioches


Et puis nous arrivons Ă  l'Ă©tape suivante, oĂč nous parlerons de ce qui est une boĂźte Ă  outils utile autour des spĂ©cifications en utilisant l'exemple OpenAPI.


Lien de la diapositive

Le premier outil dont je voudrais parler est Swagger-UI. Ci-aprĂšs, je fournirai des liens vers une ressource Web oĂč vous pouvez piquer l'outil correspondant, dans ce cas SwaggerHub, ou vers la commande pour lancer le document correspondant Ă  l'aide de Docker.

Nous aimons tous Docker. Docker vous aide à ne pas mettre JavaScript ou Java sur le local. Prenez-le, exécutez-le avec une seule commande, et tout fonctionne pour vous.

Ainsi, Swagger-UI est, en fait, un utilitaire qui vous permet d'afficher magnifiquement vos spĂ©cifications. Comme je l'ai dit plus tĂŽt, ceux-ci s'exĂ©cutent localement Ă  l'aide de Docker, peut-ĂȘtre Swagger.

Vous pouvez afficher ou partager sur les paramĂštres rĂ©gionaux en exĂ©cutant la spĂ©cification dans Swagger sur votre matĂ©riel. Et envoyez en outre tous vos utilisateurs potentiels Ă  cette spĂ©cification. Elle est dĂ©jĂ  beaucoup plus comprĂ©hensible, belle. Directement dedans, vous pouvez exĂ©cuter l'exĂ©cution des requĂȘtes.


Lien depuis la diapositive

En plus de Swagger-UI, il existe un outil Swagger-editor pratique. Vous pouvez l'utiliser sur le Web, vous pouvez le récupérer sur une locale ou sur n'importe quelle machine à écrire. Il vous permet de modifier les spécifications en temps réel et de voir son affichage ici. C'est-à-dire que c'est un outil trÚs pratique au stade de, disons, la conception d'une API, lorsque vous n'avez pas généré de spécification et que vous souhaitez en quelque sorte faire une farce ou décrire votre backend sans avoir de backend réel ou généré.



Ensuite, le merveilleux outil Prism. Je voudrais m'y attarder plus en détail. Prism est un utilitaire de Spotlight. Il vous permet, avec la spécification, d'élever le faux serveur, qui fonctionnera selon la spécification que vous lui avez donnée.

Autrement dit, dans ce cas, nous voyons le lancement de Prism en plus de la spĂ©cification, que j'ai volĂ© juste sous le magasin Swagger. Nous voyons que Prism a trouvĂ© tous les points finaux qui sont spĂ©cifiĂ©s dans la spĂ©cification, et a dit qu'ils les dĂ©rangent honnĂȘtement.

Essayons de ressentir ce que Prism peut faire.



Tout d'abord, nous trouvons le stylo, essayons de le tirer et soudain nous voyons que Prism nous dit: désolé, erreur 401. Nous allons dans la spécification et voyons qu'en fait ce stylo est caché derriÚre l'autorisation. La section de sécurité y est clairement décrite. Dans ce document, nous voyons que la méthode d'autorisation est OAuth, et nous comprenons: en fait, Prism attendait une sorte de données d'autorisation de notre part.



Essayons de lui transférer les données d'autorisation selon le format qu'il attend. Il est clair que le jeton est en quelque sorte aérien, pour Prism, peu importe ce qu'il est par essence. Le format est important pour lui. Autrement dit, s'il attend OAuth, il attend les données d'autorisation dans un format spécifique.

Nous branlons avec autorisation et voyons déjà la 400e erreur. Nous regardons ce que nous avons dans la spécification. Dans la spécification, nous voyons que nous n'avons pas passé certains attributs requis. Passons-les.



L'attribut magique est le statut. Il est, en fait, donné selon la spécification ENUM. Si nous avions transféré un statut qui n'est pas inclus dans cet ENUM, nous aurions obtenu quatre points.

Ici, nous avons passĂ© le statut valide et nous voyons que le backend a rĂ©pondu avec un xml complĂštement valide avec les donnĂ©es. Les donnĂ©es de ce fichier XML sont dĂ©sormais uniquement renvoyĂ©es Ă  partir de l'exemple spĂ©cifiĂ© dans la spĂ©cification. Autrement dit, dans la spĂ©cification pour chaque champ, il existe une section comme exemple, oĂč vous pouvez spĂ©cifier un exemple de donnĂ©es qui peuvent ĂȘtre retournĂ©es. Ici, Prism vient de les ramener.



Mais en plus du fait que vous pouvez tirer le stylo et vous attendre Ă  ce qu'il y en ait deux cents honnĂȘtes, il est possible de dire Prism - renvoyez-moi un code de rĂ©ponse spĂ©cifique. Habituellement, dans la spĂ©cification, nous dĂ©crivons les diffĂ©rents comportements de notre stylo, et avec des donnĂ©es valides, ils ne correspondent pas toujours Ă  deux cents. Ils peuvent rechercher, par exemple, la prĂ©sence d'ID dans la base de donnĂ©es, pour voir qu'un tel ID n'existe pas.

Pour ce cas, nous dĂ©clarons un certain code, disons le 400e ou le 422e, Ă  qui vous voulez. Autrement dit, avec une entrĂ©e valide, il n'y a pas toujours une sortie valide. Par consĂ©quent, dans la spĂ©cification, nous dĂ©crivons diffĂ©rentes options de rĂ©ponse. Et nous pouvons clairement dire en secouant le stylo Prism: cette fois j'attends que vous me rĂ©pondiez, disons, la 404Ăšme erreur. Disons que c'est un cas oĂč je tire la poignĂ©e avec un ID, mais il n'y a pas un tel ID.



Pour résumer, quelles sont les fonctionnalités en général, en plus de celles que j'ai déjà mentionnées? Encore une fois, il s'agit d'un faux serveur que vous pouvez récupérer. Il répondra selon le cahier des charges, validera les demandes d'autorisation. Il validera également les données que vous lui avez envoyées.

En plus de valider la demande, il générera des réponses. Dans le cas le plus simple, comme je l'ai dit, cela génÚre des réponses par l'exemple. Il existe une deuxiÚme option - lorsque vous la demandez explicitement: veuillez générer des réponses dynamiques. Une stratégie dynamique signifie que, selon le type, par exemple, int, elle générera des milliers, des milliards ou autre chose. Ou pour la chaßne, un hachage étrange et incompréhensible.

Aussi, lorsque j'ai dit lors de la premiÚre exécution que vous pouvez générer des données, nous nous sommes demandé: ce serait cool si Prism s'intégrait avec faker. Ceux qui ont utilisé le simulateur Python savent probablement à quel point c'est cool quand vous voulez verrouiller certaines données ou émuler des données dans la base de données.

Ainsi, Prism est Ă©crit en JavaScript. JavaScript a Ă©galement Faker.js, et Prism a une intĂ©gration automatique avec faker. Vous pouvez spĂ©cifier explicitement dans votre spĂ©cification les types de donnĂ©es faker que votre stylo fournira. Autrement dit, OpenAPI prend en charge un systĂšme de plug-in qui vous permet d'Ă©tendre vos spĂ©cifications afin qu'OpenAPI et l'analyseur lui-mĂȘme ne s'en soucient pas. Mais s'il existe des plugins qui analysent vos spĂ©cifications, ils peuvent utiliser des champs supplĂ©mentaires.

Ainsi, Prism vous propose d'utiliser le champ optionnel du plugin X-faker. TrĂšs confortablement.

Ici, sous l'astĂ©risque, j'ai indiquĂ© que les rappels peuvent ĂȘtre dĂ©crits dans OpenAPI. Il s'agit du schĂ©ma d'interaction lorsque vous enregistrez un rappel sur un certain stylet et attendez qu'aprĂšs cela, vous recevrez un rappel spĂ©cifique sur l'URL que vous avez enregistrĂ©e. Donc, Prism et il savent se mouiller.

D'intĂ©ressant: le prisme peut ĂȘtre Ă©levĂ© non seulement en mode maquette, mais aussi en mode proxy. Vous venez de mettre ce proxy devant votre vrai backend, et toutes les demandes qui passent par Prism et reviennent, Prism validera selon les spĂ©cifications.

Si certaines donnĂ©es - disons, entrĂ©e ou sortie, demande ou rĂ©ponse - divergent, il l'Ă©crira dans le journal. Il le fait de maniĂšre assez transparente, cela n'affecte pas le comportement rĂ©el. En gĂ©nĂ©ral, la documentation indique qu'elle peut ĂȘtre facilement augmentĂ©e en production. HonnĂȘtement, je ne l'ai pas essayĂ© moi-mĂȘme. Il y a sĂ»rement une sorte de frais gĂ©nĂ©raux, mais je ne peux toujours pas en parler. Vous pouvez sentir, essayer et dire.

De plus, grùce à ce que j'ai déjà dit, il est possible de forcer certaines demandes. Autrement dit, venez sur le faux serveur et dites: Je veux un exemple ou un type de réponse spécifique. Nous avons déjà parlé du type de réponse. Toujours dans la spécification OpenAPI, il est possible de spécifier plusieurs options de réponse et de les nommer explicitement.

Donc, vous pouvez venir dire Prism: cette fois je veux un exemple précis, la prochaine fois je veux un autre exemple.


Lien de la diapositive

À propos de Prism parlĂ©. Maintenant Ă  propos de Postman. Je l'aime tellement. Ainsi, Postman a une intĂ©gration prĂȘte Ă  l'emploi avec OpenAPI. Vous pouvez littĂ©ralement importer la spĂ©cification OpenAPI en seulement deux clics sur les boutons. Et il crĂ©era une collection de demandes selon vos spĂ©cifications.

En mĂȘme temps, il prĂ©-prĂ©parera tous les paramĂštres de requĂȘte, tous les paramĂštres de corps, tout l'environnement et l'autorisation. Il vous suffit de terminer les donnĂ©es avec de vrais identifiants ou autre chose, des jetons d'autorisation. TrĂšs confortablement.



Nous passons de Postman plus loin. Nous avons parlĂ© de Prism, il a des fonctionnalitĂ©s - validation des requĂȘtes. En fait, il existe un utilitaire distinct qui vous permet de sucer sans pitiĂ© votre backend vraiment en cours d'exĂ©cution et de voir s'il fonctionne vraiment selon les spĂ©cifications.

Dredd analyse la spĂ©cification. Il prend, tire tous les stylos et regarde ce qui lui est retournĂ©. En gĂ©nĂ©ral, dredd peut ĂȘtre traitĂ© comme une infrastructure pour Ă©crire des tests, car toutes ses requĂȘtes peuvent ĂȘtre complĂ©tĂ©es par ses hooks. Autrement dit, Ă  partir de la boĂźte, vous pouvez commencer Ă  dredd tel quel, comme je l'ai lancĂ© ici.

Ou vous pouvez exécuter dredd en lui passant un ensemble de crochets qui fonctionnent réellement dans l'idéologie d'un test régulier. Il y a quelque chose qui monte à l'ensemble des tests, il y a des hooks qui tournent avant le test, aprÚs le test, toute l'infrastructure.


Lien de la diapositive

Ensuite, je veux parler plus en dĂ©tail d'un tel outil de Swagger lui-mĂȘme comme Swagger-codegen. En fait, c'est un peu comme un couteau suisse. Pour commencer, quel genre de pensĂ©es les gars ont-ils eu quand ils ont Ă©crit cet instrument.

Habituellement, lorsque quelqu'un doit s'intégrer à un backend, vous décrivez rarement une demande http ici, à un certain stade, dans la logique métier. Le plus souvent, vous encapsulez le travail avec un backend spécifique dans une entité, dans le client.

Donc, les gars ont eu l'idée que, ayant une spécification, nous pouvons trÚs clairement décrire et prédire à quoi ressemblerait le client pour ce backend. Et les gars ont fait un générateur de clients.



Essayons de dĂ©marrer la gĂ©nĂ©ration du client conformĂ©ment aux spĂ©cifications de l'animalerie. Nous verrons que ce gĂ©nĂ©rateur a Ă©tĂ© gĂ©nĂ©rĂ© par le client Swagger lui-mĂȘme, dans lequel se trouve le client Python lui-mĂȘme. Ici, dans la ligne de lancement, vous pouvez clairement voir que je gĂ©nĂšre un client en Python. En fait, il prend en charge un grand nombre de langues. Qu'est-ce qui est important ici? Les pionniers apprĂ©cieront JavaScript, les hipsters apprĂ©cieront Go. Tout ce que vous voulez.

Ainsi, en plus du client en Python, il a gĂ©nĂ©rĂ© quelques documents et testĂ© des dossiers magiques. Nous en parlerons plus tard plus en dĂ©tail. Et beaucoup de sucre pour que vous puissiez envelopper ce client dans une bibliothĂšque prĂȘte Ă  l'emploi. Il y a gitignore, il y a des fichiers CI, disons pour Travis, il y a du sucre pour git. Il existe des exigences, setup.py et tox.ini. Autrement dit, tout ce qui vous aide simplement Ă  prendre, valider et envoyer ce client est dĂ©jĂ  sous la forme d'une bibliothĂšque qui peut ĂȘtre rĂ©utilisĂ©e.

Examinons de plus prÚs ce qu'il a généré chez le client.



Dans le client, il a généré, en plus de certains fichiers auxiliaires, deux répertoires trÚs importants api et modÚles. Dans les modÚles, nous avons ces modÚles de données que nous manipulons. Chaque modÚle est simplement une classe Python héritée de l'objet avec __init__, qui prend toutes sortes de paramÚtres pour ce schéma, et des getters et setters qui changent l'état de l'objet.



En plus du modÚle, des entités telles que PetApi y sont également apparues - ce ne sont que des wrappers clients sur le groupe de points de terminaison, que OpenAPI regroupe soit par balises soit par points de terminaison.

Et ce client a tous les stylos que vous pouvez contracter, transmettant des données réelles. Ensuite, ils s'envoleront vers un backend.



Qu'est-ce qui est implémenté à partir de ce client généré? De l'intéressant - l'approche contractuelle. Parlons plus de lui.

L'approche contractuelle de la programmation suggÚre que lorsque vous implémentez l'interaction entre le client et le serveur, vous définissez en fait toujours certaines rÚgles, des contrats, qu'il s'agisse de données que le client donne au serveur ou de données que le serveur donne au client.

Ainsi, l'approche contractuelle vous recommande de vérifier à chaque fois en temps réel la conformité de vos données et de votre interaction avec le contrat. Si ce contrat est un schéma des données que nous transmettons, et ne répond pas à nos attentes, n'est pas satisfait, alors vous devez le dire, montrer l'erreur ici et maintenant. N'allez pas au vrai backend, n'attendez pas de quatre points, mais dites tout de suite.

Ou un autre cas: nous sommes allĂ©s au backend, avons reçu des donnĂ©es, mais elles ne correspondent pas Ă  ce que nous attendions. Supposons que certains champs que nous nous attendions Ă  voir remplis deviennent vides. Nous en parlerons ici et maintenant, et non pas lorsque nous laisserons quelque part sur la pile d'appels quelque part dans la forĂȘt et ne dĂ©couvrirons pas pourquoi quelque chose est tombĂ©.

Ainsi, Swagger-codegen génÚre des clients et des modÚles selon l'approche contractuelle. Il vous permet de dire en temps réel: oui, je veux que le client en exécution vérifie toutes les données pour la conformité avec les contrats. Et si le contrat n'est pas satisfait, il le dira immédiatement.



Nous avons gĂ©nĂ©rĂ© une sorte de pit-client avec une approche contractuelle, mais en plus de cela, Swagger-codegen a gĂ©nĂ©rĂ© des talons de documentation pour nous. En fait, ils sont assez simples, mais ils peuvent tous ĂȘtre tordus pour chaque modĂšle.



Swagger-codegen a également généré une sorte de talons de test. Tout pour que vous puissiez déployer le code généré avec un minimum d'effort et l'exécuter avec des tests, avec une intégration continue, sous la forme d'une bibliothÚque avec un git, avec toutes les cloches et les sifflets.



Revoyons-le briÚvement. Nous avons examiné un seul cas - un moyen de générer des clients pour l'API. De l'importante} approche contractuelle. Je voudrais dire: lorsque j'ai généré un client pour une véritable animalerie selon leurs spécifications et que je suis vraiment allé dans son backend, cette approche contractuelle a soudainement saisi les données invalides qui ont été retournées par l'animalerie.

Au dĂ©but, j'ai pensĂ© - ils sont un peu Ă©tranges. Ils ont eux-mĂȘmes gĂ©nĂ©rĂ© la spĂ©cification et le backend ne fonctionne pas correctement pour eux. Mais il me semble qu'ils l'ont fait exprĂšs pour que nous puissions voir la puissance de l'approche contractuelle. Il n'y avait pas beaucoup de donnĂ©es et elles Ă©taient clairement gĂ©nĂ©rĂ©es.

Aussi dans la génération de clients et dans une autre génération, vous pouvez utiliser vos propres modÚles. Autrement dit, si vous souhaitez générer un client dans un certain format, vous pouvez enregistrer et préparer votre modÚle et générer des clients comme vous le souhaitez. Si vous faites le tour et générez des intégrations tous les jours, cela pourrait vous plaire beaucoup.

Vous pouvez également configurer ces clients et écrire l'importation de vos modÚles, plutÎt que ceux générés par Swagger-codegen.

En plus de gĂ©nĂ©rer des clients pour l'API, vous pouvez transmettre la spĂ©cification au gĂ©nĂ©rateur et gĂ©nĂ©rer les stubs du serveur lui-mĂȘme. C'est trĂšs Ă©trange. Autrement dit, vous gĂ©nĂ©rez une sorte de backend qui fonctionne soi-disant conformĂ©ment aux spĂ©cifications. Il est clair qu'il n'y a aucune logique commerciale lĂ -bas. Mais peut-ĂȘtre que ce sera pratique comme une sorte d'Ă©chafaudage, c'est-Ă -dire prĂ©parer un projet avec lequel vous pouvez dĂ©jĂ  faire quelque chose. Je ne l'ai pas utilisĂ©, mais je recommande d'y jeter un coup d'Ɠil - peut-ĂȘtre trouverez-vous quelque chose d'utile pour vous-mĂȘme.

Entre autres, il vous permet de gĂ©nĂ©rer de la documentation au format HTML et Confluence si quelqu'un l'utilise. Les exemples que je voulais montrer pour OpenAPI se sont Ă©galement arrĂȘtĂ©s lĂ .


Tous ces outils sont disponibles sur les deux liens ci-dessous sur la diapositive: openapi.tools etgithub.com/APIs-guru/awesome-openapi3

Je veux montrer les groupes de réglages autour de la spécification OpenAPI. En fait, il existe de nombreux outils. Ce ne sont que des groupes, c'est-à-dire des types d'outils que vous pouvez utiliser.

L'important ici est un convertisseur d'une spécification à une autre. Autrement dit, vous pouvez générer l'API Blueprint ou tout ce que vous voulez à partir de la spécification OpenAPI, et vice versa. Il existe une bibliothÚque pour la simulation, pour la documentation. Autrement dit, tout ce dont j'ai parlé se reflétera dans ces groupes.

Il existe Ă©galement un lien que vous pouvez suivre. Assurez-vous d'aller chercher.


Lien depuis la diapositive

Outre les outils autour d'OpenAPI, il existe des outils autour de Swagger. Il y a SwaggerHub et Swagger Inspector. Ils sont surlignés en bleu car il s'agit d'une boßte à outils Web. Vous pouvez vous y rendre directement et utiliser en tant que service le SwaggerHub et Swagger Inspector, qui sont en fait une superposition des bibliothÚques suivantes: Swagger-editor, Swagger-codegen, Swagger-UI. Tout ce que nous venons de discuter.

Toutes les bibliothÚques sont jaunes, elles sont open source, comme nous l'avons vu. Il existe sur GitHub, se présente sous la forme de Docker. Utilisation.

Conclusion




De quoi avons-nous discutĂ© aujourd'hui? SpĂ©cification de l'API REST utilisant OpenAPI et Swagger comme exemples. Je tiens Ă  souligner que OpenAPI n'est qu'une façon de dĂ©crire la spĂ©cification. Beaucoup d'entre eux. Parmi les plus intĂ©ressants, voir Ă©galement l'API Blueprint. Peut-ĂȘtre que quelqu'un d'autre aimera quelque chose.



Nous avons Ă©galement regardĂ© Swagger. En substance, comme nous l'avons dĂ©jĂ  dit, ce n'est qu'une belle interface utilisateur autour de la spĂ©cification, qui vous permet de la regarder et de l'explorer de maniĂšre pratique. En fait, ces outils sont Ă©galement nombreux, allant des populaires ReDoc et Sphinx, et se terminant, en fait, Markdown. Autrement dit, vous pouvez gĂ©nĂ©rer Markdown Ă  partir d'OpenAPI, et il sera magnifiquement affichĂ© dans tous les GitHub, GitLab - oĂč vous le souhaitez.

Nous avons également examiné un exemple de notre pile technologique sur la façon dont nous générons maintenant la spécification. Mais comme vous l'avez remarqué, cela est assez compliqué et peu pratique, car nous dupliquons en fait la logique métier et les docstrings.


Liens de la diapositive: FastAPI , SAFRS , rororo

D'intĂ©ressant, je vous conseille de regarder FastAPI. Styopa vous en dira plus Ă  ce sujet aujourd'hui . FastAPI vous aide Ă  gĂ©nĂ©rer une spĂ©cification prĂȘte Ă  l'emploi. Vous n'y pouvez penser Ă  rien du tout. Écrivez simplement le code et obtenez les spĂ©cifications finales.

Il existe deux autres cadres: SAFRS et rororo. Les noms, bien sĂ»r, sont magiques. Ils fonctionnent un peu sur un modĂšle diffĂ©rent, ne vous font pas penser Ă  la spĂ©cification et ne l'obtiennent que comme un effet secondaire. Au contraire, vous avez une spĂ©cification qui pilote les gestionnaires. Il s'agit, en gros, d'un dĂ©veloppement axĂ© sur les spĂ©cifications. Ils n'ont pas autant d'Ă©toiles que FastAPI, mais il me semble qu'ils mĂ©ritent attention, jetez un Ɠil.



Et enfin, nous avons discuté du type d'utilité autour de la spécification en utilisant les exemples d'OpenAPI et de Swagger. Pour tous les points que je fais des liens, regardez bien, il y a beaucoup de choses intéressantes:

- OpenAPI / Swagger
swagger.io/docs/specification/about

- Exemple sur falcon + marshmallow + apispec
github.com/marshmallow-code/apispec
github.com/tiangolo/fastapi

- OpenAPI / Swagger
petits pains
openapi.tools swagger.io/tools swagger.io/tools/open-source/open-source-integrations github.com/APIs-guru/awesome-openapi3

Que dois - je était le message du rapport? Les gars, la rédaction de spécifications n'est pas une sorte de bureaucratie. Et ce n'est pas aussi difficile que cela puisse paraßtre à premiÚre vue, mais plutÎt simple et fournit de nombreux outils utiles, vous ouvre de grandes opportunités.

Écrivez les spĂ©cifications. Recommander. Merci beaucoup.



Tous les codes et liens sont disponibles dans la présentation .

All Articles