Automatisation pour les plus petits. Remarques. API RESTful

Cet article est l'une des courtes notes promises lors de la série d'articles Automation For The Smallest .
Étant donnĂ© que la principale façon d'interagir avec le systĂšme IPAM est l'API RESTful, j'ai dĂ©cidĂ© d'en parler sĂ©parĂ©ment.



Je rends hommage aux architectes du monde moderne - nous avons des interfaces standardisées. Oui, il y en a beaucoup - c'est un moins, mais ils le sont - c'est un plus.

Ces interfaces ont gagné le nom d'API - Application Programming Interface.

L'une de ces interfaces est l'API RESTful, qui est utilisée pour fonctionner avec NetBox.



Si c'est trĂšs simple, l'API fournit au client un ensemble d'outils Ă  travers lesquels il peut gĂ©rer le serveur. Et le client peut ĂȘtre essentiellement n'importe quoi: un navigateur Web, une console de commande, une application dĂ©veloppĂ©e par le fabricant ou toute autre application ayant accĂšs Ă  l'API.

Par exemple, dans le cas de NetBox, vous pouvez y ajouter un nouveau pĂ©riphĂ©rique de la maniĂšre suivante: via un navigateur Web, en envoyant une requĂȘte curl'om dans la console, utilisez Postman, accĂ©dez Ă  la bibliothĂšque de requĂȘtes en python, utilisez le SDK pynetbox ou accĂ©dez Ă  Swagger.

Ainsi, aprĂšs avoir Ă©crit une seule interface, le constructeur s'affranchit Ă  jamais de la nĂ©cessitĂ© de convenir avec chaque nouveau client de la maniĂšre de la connecter (mĂȘme si ce n'est qu'un peu rusĂ©).

Table des matiĂšres


  • REST, RESTful, API
  • Structure des messages HTTP
    • Ligne de dĂ©part
    • Rubriques
    • Le corps du message HTTP

  • Les mĂ©thodes
    • HTTP GET
    • POST HTTP
    • HTTP PUT
    • PATCH HTTP
    • SUPPRESSION HTTP

  • Façons de travailler avec l'API RESTful
    • Curl
    • Facteur
    • Python + Demandes
    • Kit de dĂ©veloppement logiciel Pynebtbox
    • Swagger

  • Critique du REST et des alternatives
  • Liens utiles

REST, RESTful, API


Ci-dessous, je vais donner une description trÚs simplifiée de ce qu'est REST.

Pour commencer, l' API RESTful est exactement l' interface d' interaction basĂ©e sur REST , tandis que REST ( REpresentational State Transfer ) lui-mĂȘme est un ensemble de restrictions utilisĂ©es pour crĂ©er des services WEB.

Il est possible de lire exactement quelles limitations peuvent ĂȘtre trouvĂ©es dans le chapitre 5 de la thĂšse de Roy Fielding, Styles architecturaux et conception d'architectures logicielles basĂ©es sur le rĂ©seau . Permettez-moi de vous donner seulement les trois plus importants (de mon point de vue) d'entre eux:

  1. L'architecture REST utilise le modĂšle d'interaction client-serveur.
  2. Chaque demande REST contient toutes les informations nécessaires à son exécution. Autrement dit, le serveur ne doit se souvenir de rien sur les demandes précédentes des clients, qui, comme vous le savez, se caractérise par le mot Stateless - ne stocke pas les informations d'état.
  3. Interface unifiĂ©e. L'implĂ©mentation de l'application est distincte du service qu'elle fournit. Autrement dit, l'utilisateur sait ce qu'il fait et comment interagir avec lui, mais comment il le fait n'a pas d'importance. Lorsque vous modifiez l'application, l'interface reste la mĂȘme et les clients n'ont pas besoin de s'adapter.

Les services WEB qui satisfont à tous les principes de REST sont appelés services WEB RESTful .

Et l'API qui fournit les services WEB RESTful s'appelle l'API RESTful.

REST n'est pas un protocole, mais le soi-disant style d'architecture (l'un des). Développé avec HTTP par Roy Fielding, REST était destiné à utiliser HTTP 1.1 comme transport.

Adresse de destination (ou en d'autres termes - un objet, ou d'une autre maniĂšre - un point de terminaison) - c'est notre URI habituel.

Le format des données transmises est XML ou JSON .
Pour cette série d'articles sur linkmeup, un déploiement en lecture seule a été déployé (pour vous, chers lecteurs). Installation de NetBox: netbox.linkmeup.ru : 45127.

Les droits de lecture ne sont pas requis, mais si vous voulez essayer de lire avec un jeton, vous pouvez utiliser ceci: API de jeton: 90a22967d0bc4bdcd8ca47ec490bbf0b0cb2d9c8 .
Faisons une demande de plaisir:

curl -X GET -H "Authorization: TOKEN 90a22967d0bc4bdcd8ca47ec490bbf0b0cb2d9c8" \ -H "Accept: application/json; indent=4" \ http://netbox.linkmeup.ru:45127/api/dcim/devices/1/ 

Autrement dit, avec l'utilitaire curl , nous créons un objet GET à netbox.linkmeup.ru : 45127 / api / dcim / devices / 1 / avec une réponse JSON et un retrait de 4 espaces.

Ou un peu plus académiquement: GET renvoie l'objet devices typé, qui est un paramÚtre de l'objet DCIM .

Vous pouvez également répondre à cette demande - il vous suffit de la copier sur votre terminal.
L'URL à laquelle nous faisons référence dans la demande s'appelle Endpoint . Dans un sens, c'est l'objet final avec lequel nous allons interagir.
Par exemple, dans le cas de netbox, une liste de tous les points de terminaison peut ĂȘtre obtenue ici .
Et faites attention au signe / Ă  la fin de l'URL - il est obligatoire .
Voici ce que nous obtenons en réponse:

 { "id": 1, "name": "mlg-host-0", "display_name": "mlg-host-0", "device_type": { "id": 4, "url": "http://netbox.linkmeup.ru/api/dcim/device-types/4/", "manufacturer": { "id": 4, "url": "http://netbox.linkmeup.ru/api/dcim/manufacturers/4/", "name": "Hypermacro", "slug": "hypermacro" }, "model": "Server", "slug": "server", "display_name": "Hypermacro Server" }, "device_role": { "id": 1, "url": "http://netbox.linkmeup.ru/api/dcim/device-roles/1/", "name": "Server", "slug": "server" }, "tenant": null, "platform": null, "serial": "", "asset_tag": null, "site": { "id": 6, "url": "http://netbox.linkmeup.ru/api/dcim/sites/6/", "name": "", "slug": "mlg" }, "rack": { "id": 1, "url": "http://netbox.linkmeup.ru/api/dcim/racks/1/", "name": "A", "display_name": "A" }, "position": 41, "face": { "value": "front", "label": "Front", "id": 0 }, "parent_device": null, "status": { "value": "active", "label": "Active", "id": 1 }, "primary_ip": null, "primary_ip4": null, "primary_ip6": null, "cluster": null, "virtual_chassis": null, "vc_position": null, "vc_priority": null, "comments": "", "local_context_data": null, "tags": [], "custom_fields": {}, "config_context": {}, "created": "2020-01-14", "last_updated": "2020-01-14T18:39:01.288081Z" } 

Il s'agit de JSON (comme nous l'avons demandĂ©), dĂ©crivant l'appareil avec l'ID 1: ce qui est appelĂ©, avec quel rĂŽle, quel modĂšle, oĂč il se trouve, etc.

Cela ressemblera Ă  une requĂȘte HTTP:

  GET /api/dcim/devices/1/ HTTP/1.1 Host: netbox.linkmeup.ru:45127 User-Agent: curl/7.54.0 Accept: application/json; indent=4 


La réponse sera donc:
  HTTP/1.1 200 OK Server: nginx/1.14.0 (Ubuntu) Date: Tue, 21 Jan 2020 15:14:22 GMT Content-Type: application/json Content-Length: 1638 Connection: keep-alive Data 

Videz la transaction .

Voyons maintenant ce que nous avons fait.



Structure des messages HTTP


Un message HTTP se compose de trois parties, seule la premiĂšre est requise.

  • Ligne de dĂ©part
  • Rubriques
  • Corps du message

Ligne de départ


Les lignes de départ de la demande et de la réponse HTTP sont différentes.

RequĂȘte HTTP


 METHOD URI HTTP_VERSION 

La méthode détermine quelle action le client souhaite effectuer: recevoir des données, créer un objet, le mettre à jour, le supprimer.
URI - l'identifiant de la ressource Ă  laquelle le client accĂšde, ou en d'autres termes, le chemin d'accĂšs Ă  la ressource / au document.
HTTP_VERSION est la version HTTP, respectivement. Aujourd'hui, pour REST, c'est toujours 1.1.
Un exemple:

 GET /api/dcim/devices/1/ HTTP/1.1 


RĂ©ponse HTTP


 HTTP_VERSION STATUS_CODE REASON_PHRASE 

HTTP_VERSION - version HTTP (1.1).
STATUS_CODE - trois chiffres du code d'Ă©tat (200, 404, 502, etc.)
PHASE DE RAISON - Explication (OK, PAS TROUVÉ, MAUVAISE PASSERELLE, etc.)

Un exemple:

 HTTP/1.1 200 OK 

Rubriques


Les en-tĂȘtes transmettent les paramĂštres de cette transaction HTTP.

Par exemple, dans l'exemple ci-dessus dans la demande HTTP, ce sont:

  Host: netbox.linkmeup.ru:45127 User-Agent: curl/7.54.0 Accept: application/json; indent=4 

Ils indiquent que

  1. Nous nous tournons vers l'hĂŽte netbox.linkmeup.ru:45127 ,
  2. La demande a été générée en boucle ,
  3. Et nous acceptons les données au format JSON avec une indentation de 4 .

Et voici les en-tĂȘtes de la rĂ©ponse HTTP:

  Server: nginx/1.14.0 (Ubuntu) Date: Tue, 21 Jan 2020 15:14:22 GMT Content-Type: application/json Content-Length: 1638 Connection: keep-alive 

Ils indiquent que

  1. Type de serveur: nginx sur Ubuntu ,
  2. Temps de réponse
  3. Format des données de réponse: JSON
  4. Longueur des données de réponse: 1638 octets
  5. La connexion n'a pas besoin d'ĂȘtre fermĂ©e - il y aura toujours des donnĂ©es.

Les en-tĂȘtes, comme vous l'avez dĂ©jĂ  remarquĂ©, ressemblent Ă  des paires nom: valeur, sĂ©parĂ©es par un signe ":".

Une liste complĂšte des en-tĂȘtes possibles .

Le corps du message HTTP


Le corps est utilisé pour transférer les données réelles.

Dans la rĂ©ponse HTTP, cela peut ĂȘtre une page HTML, ou dans notre cas un objet JSON.

Il doit y avoir au moins une ligne vierge entre les en-tĂȘtes et le corps.

Lors de l'utilisation de la mĂ©thode GET dans une requĂȘte HTTP, il n'y a gĂ©nĂ©ralement pas de corps car il n'y a rien Ă  transmettre. Mais le corps est dans la rĂ©ponse HTTP.

Mais par exemple, avec POST, le corps sera déjà dans la demande. Parlons des méthodes et parlons maintenant.



Les méthodes


Comme vous l'avez dĂ©jĂ  compris, HTTP utilise des mĂ©thodes pour travailler avec les services WEB. Il en va de mĂȘme pour l'API RESTful.

Les scénarios réels possibles sont décrits par le terme CRUD - Créer, lire, mettre à jour, supprimer .
Voici une liste des méthodes HTTP les plus populaires qui implémentent CRUD:

  • HTTP GET
  • POST HTTP
  • HTTP PUT
  • SUPPRESSION HTTP
  • PATCH HTTP

Les méthodes sont également appelées verbes , car elles indiquent quelle action est effectuée.

Liste complÚte des méthodes .

Examinons chacun d'eux en utilisant l'exemple NetBox.

HTTP GET


Il s'agit d'une méthode pour obtenir des informations.

Ainsi, par exemple, nous supprimons la liste des appareils:

 curl -H "Accept: application/json; indent=4" \ http://netbox.linkmeup.ru:45127/api/dcim/devices/ 

La méthode GET est sûre car elle ne modifie pas les données, mais demande uniquement.

Il est idempotent du point de vue que la mĂȘme requĂȘte renvoie toujours le mĂȘme rĂ©sultat (jusqu'Ă  ce que les donnĂ©es elles-mĂȘmes aient changĂ©).

Sur GET, le serveur renvoie un message avec le code HTTP et le corps de réponse ( code de réponse et corps de réponse ).

Autrement dit, si tout va bien, alors le code de réponse est 200 (OK).
Si l'URL n'est pas trouvĂ©e, 404 (PAS TROUVÉ).
Si quelque chose ne va pas avec le serveur ou les composants eux-mĂȘmes, il peut s'agir de 500 (ERREUR DE SERVEUR) ou 502 (MAUVAISE PASSERELLE).
Tous les codes de réponse possibles .

Le corps est renvoyé au format JSON ou XML.

Videz la transaction .

Donnons quelques exemples supplémentaires. Nous allons maintenant demander des informations sur un appareil spécifique par son nom.

 curl -X GET -H "Accept: application/json; indent=4" \ "http://netbox.linkmeup.ru:45127/api/dcim/devices/?name=mlg-leaf-0" 

Ici, pour définir les conditions de recherche dans l'URI, j'ai également spécifié l'attribut de l'objet (le paramÚtre de nom et sa valeur mlg-leaf-0 ). Comme vous pouvez le voir, avant la condition et aprÚs la barre oblique, il y a un "?" et le nom et la valeur sont séparés par un signe "=" .

Voici Ă  quoi ressemble la demande.

  GET /api/dcim/devices/?name=mlg-leaf-0 HTTP/1.1 Host: netbox.linkmeup.ru:45127 User-Agent: curl/7.54.0 Accept: application/json; indent=4 

Videz la transaction .

Si vous devez spĂ©cifier quelques conditions, la requĂȘte ressemblera Ă  ceci:

 curl -X GET -H "Accept: application/json; indent=4" \ "http://netbox.linkmeup.ru:45127/api/dcim/devices/?role=leaf&site=mlg" 

Ici, nous avons demandé tous les dispositifs à feuilles situés sur le site Web de mlg .
C'est-à-dire que les deux conditions sont séparées l'une de l'autre par le signe "&" .

Videz la transaction .

Du curieux et de l'agrĂ©able - si Ă  travers "&" vous dĂ©finissez deux conditions avec le mĂȘme nom, alors entre elles il n'y aura en fait pas un "ET" logique, mais un "OU" logique.

Autrement dit, une telle requĂȘte retournera en fait deux objets: mlg-leaf-0 et mlg-spine-0

 curl -X GET -H "Accept: application/json; indent=4" \ "http://netbox.linkmeup.ru:45127/api/dcim/devices/?name=mlg-leaf-0&name=mlg-spine-0" 

Videz la transaction .

Essayons d'accéder à une URL inexistante.

 curl -X GET -H "Accept: application/json; indent=4" \ "http://netbox.linkmeup.ru:45127/api/dcim/IDGAF/" 

Videz la transaction .



POST HTTP


POST est utilisé pour créer un nouvel objet dans une collection d'objets. Ou dans un langage plus complexe: pour créer une nouvelle ressource subordonnée.

Clarification d' Arthuriantech :
Y compris, mais sans s'y limiter. La mĂ©thode POST est conçue pour transfĂ©rer des donnĂ©es vers le serveur pour un traitement ultĂ©rieur - elle est utilisĂ©e pour toutes les actions qui n'ont pas besoin d'ĂȘtre normalisĂ©es dans HTTP. Avant la RFC 5789, c'Ă©tait le seul moyen lĂ©gal d'apporter des modifications partielles.
roy.gbiv.com/untangled/2009/it-is-okay-to-use-post
tools.ietf.org/html/rfc7231#section-4.3.3


Autrement dit, s'il existe un ensemble de périphériques, alors POST vous permet de créer un nouvel objet de périphérique à l'intérieur des périphériques.

SĂ©lectionnez le mĂȘme point de terminaison et utilisez POST pour crĂ©er un nouveau pĂ©riphĂ©rique.

 curl -X POST "http://netbox.linkmeup.ru:45127/api/dcim/devices/" \ -H "accept: application/json"\ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" \ -d "{ \"name\": \"just a simple russian girl\", \"device_type\": 1, \"device_role\": 1, \"site\": 3, \"rack\": 3, \"position\": 5, \"face\": \"front\"}" 

Un en-tĂȘte d' autorisation apparaĂźt dĂ©jĂ  ici, contenant un jeton qui autorise la demande d'Ă©criture, et aprĂšs la directive -d, il y a JSON avec les paramĂštres du pĂ©riphĂ©rique crĂ©Ă©:

 { "name": "just a simple russian girl", "device_type": 1, "device_role": 1, "site": 3, "rack": 3, "position": 5, "face": "front"} 

Votre demande ne fonctionnera pas, car le jeton n'est plus valide - n'essayez pas d'Ă©crire dans NetBox.
La rĂ©ponse est accompagnĂ©e d'une rĂ©ponse HTTP avec le code 201 (CREATED) et JSON dans le corps du message, oĂč le serveur renvoie tous les paramĂštres concernant le pĂ©riphĂ©rique crĂ©Ă©.

  HTTP/1.1 201 Created Server: nginx/1.14.0 (Ubuntu) Date: Sat, 18 Jan 2020 11:00:22 GMT Content-Type: application/json Content-Length: 1123 Connection: keep-alive JSON 

Videz la transaction .

Maintenant, avec une nouvelle demande avec la méthode GET, vous pouvez la voir dans la sortie:

 curl -X GET -H "Accept: application/json; indent=4" \ "http://netbox.linkmeup.ru:45127/api/dcim/devices/?q=russian" 

"Q" dans NetBox vous permet de trouver tous les objets qui contiennent en leur nom une ligne qui va plus loin.
POST, Ă©videmment, n'est ni sĂ»r ni idempotent - il modifie probablement les donnĂ©es, et une requĂȘte Ă  double exĂ©cution conduira soit Ă  la crĂ©ation d'une seconde du mĂȘme objet, soit Ă  une erreur.



HTTP PUT


Il s'agit d'une méthode pour modifier un objet existant. Le point de terminaison de PUT est différent de celui de POST - il contient maintenant un objet spécifique.

PUT peut renvoyer les codes 201 ou 200.

Un point important avec cette méthode: vous devez passer tous les attributs requis, car PUT remplace l'ancien objet.

Par conséquent, si, par exemple, en essayant simplement d'ajouter l'attribut asset_tag à notre nouvel appareil, nous obtenons une erreur:

 curl -X PUT "http://netbox.linkmeup.ru:45127/api/dcim/devices/18/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" \ -d "{ \"asset_tag\": \"12345678\"}" 

 {"device_type":["This field is required."],"device_role":["This field is required."],"site":["This field is required."]} 

Mais si vous ajoutez les champs manquants, alors tout fonctionnera:

 curl -X PUT "http://netbox.linkmeup.ru:45127/api/dcim/devices/18/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" \ -d "{ \"name\": \"just a simple russian girl\", \"device_type\": 1, \"device_role\": 1, \"site\": 3, \"rack\": 3, \"position\": 5, \"face\": \"front\", \"asset_tag\": \"12345678\"}" 

Videz la transaction .
Faites attention Ă  l'URL ici - elle comprend maintenant l'ID de l'appareil que nous voulons changer ( 18 ).



PATCH HTTP


Cette méthode est utilisée pour modifier partiellement la ressource.
Wat? Vous demandez, mais qu'en est-il de PUT?

PUT est une mĂ©thode qui existait Ă  l'origine dans la norme, impliquant le remplacement complet d'un objet mutable. En consĂ©quence, dans la mĂ©thode PUT, comme je l'ai Ă©crit ci-dessus, vous devrez spĂ©cifier mĂȘme les attributs de l'objet qui ne changent pas.

Et PATCH a été ajouté plus tard et vous permet de spécifier uniquement les attributs qui changent vraiment.

Par exemple:

 curl -X PATCH "http://netbox.linkmeup.ru:45127/api/dcim/devices/18/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" \ -d "{ \"serial\": \"BREAKINGBAD\"}" 

Ici, l'ID du périphérique est également spécifié dans l'URL, mais il n'y a qu'un seul attribut série à modifier.

Videz la transaction .



SUPPRESSION HTTP


Supprime Ă©videmment l'objet.

Un exemple.

 curl -X DELETE "http://netbox.linkmeup.ru:45127/api/dcim/devices/21/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" 

La mĂ©thode DELETE est idempotente du point de vue qu'une requĂȘte rĂ©pĂ©tĂ©e ne modifie plus rien dans la liste des ressources (mais renvoie le code 404 (NOT FOUND).

 curl -X DELETE "http://netbox.linkmeup.ru:45127/api/dcim/devices/21/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" 

 {"detail":"Not found."} 



Façons de travailler avec l'API RESTful


Curl est, bien sûr, trÚs pratique pour les vaillants guerriers CLI, mais il existe de meilleurs outils.

Facteur


Postman vous permet de former des requĂȘtes dans l'interface graphique en sĂ©lectionnant les mĂ©thodes, les en-tĂȘtes, le corps et affiche le rĂ©sultat sous une forme lisible par l'homme.

De plus, les requĂȘtes et les URI peuvent ĂȘtre enregistrĂ©s et leur ĂȘtre retournĂ©s ultĂ©rieurement.

Téléchargez Postman sur le site officiel .

Nous pouvons donc faire un GET:


Ici, Token est indiqué dans le GET à titre d'exemple uniquement.

Et donc POST:



Postman est destinĂ© Ă  ĂȘtre utilisĂ© avec l'API RESTful uniquement.
Par exemple, n'essayez pas d'envoyer du NETCONF XML Ă  travers lui, comme je l'ai fait Ă  l'aube de ma carriĂšre en automatisation.
L'un des avantages intéressants de l'API spécifiée est que vous pouvez importer tous les points de terminaison et leurs méthodes dans Postman en tant que collection.

Pour ce faire, dans la fenĂȘtre Importer (Fichier-> Importer), sĂ©lectionnez Importer depuis le lien et collez dans la fenĂȘtre netbox.linkmeup.ru URL: 45127 / api / docs /? Format = openapi.



De plus, tout ce que vous pouvez trouver se trouve dans les collections.






Python + requĂȘtes


Mais mĂȘme via Postman, vous ne gĂ©rerez probablement pas vos systĂšmes de production. Vous aurez sĂ»rement des applications externes qui voudront interagir avec elles sans votre participation.

Par exemple, un systÚme de génération de configuration souhaite récupérer une liste d'interfaces IP de NetBox.
Python possĂšde une merveilleuse bibliothĂšque de requĂȘtes qui implĂ©mente le travail via HTTP.
Un exemple de demande d'une liste de tous les appareils:

 import requests HEADERS = {'Content-Type': 'application/json', 'Accept': 'application/json'} NB_URL = "http://netbox.linkmeup.ru:45127" request_url = f"{NB_URL}/api/dcim/devices/" devices = requests.get(request_url, headers = HEADERS) print(devices.json()) 

Ajoutez Ă  nouveau un nouvel appareil:

 import requests API_TOKEN = "a9aae70d65c928a554f9a038b9d4703a1583594f" HEADERS = {'Authorization': f'Token {API_TOKEN}', 'Content-Type': 'application/json', 'Accept': 'application/json'} NB_URL = "http://netbox.linkmeup.ru:45127" request_url = f"{NB_URL}/api/dcim/devices/" device_parameters = { "name": "just a simple REQUESTS girl", "device_type": 1, "device_role": 1, "site": 3, } new_device = requests.post(request_url, headers = HEADERS, json=device_parameters) print(new_device.json()) 



SDK Python + NetBox


Dans le cas de NetBox, il existe également un SDK Python - Pynetbox , qui représente tous les points de terminaison NetBox en tant qu'objet et ses attributs, faisant tout le sale boulot pour vous de générer des URI et d'analyser la réponse, bien que pas gratuitement, bien sûr.

Par exemple, faisons la mĂȘme chose que ci-dessus, en utilisant pynetbox.
Liste de tous les appareils:

 import pynetbox NB_URL = "http://netbox.linkmeup.ru:45127" nb = pynetbox.api(NB_URL) devices = nb.dcim.devices.all() print(devices) 

Ajouter un nouvel appareil:

 import pynetbox API_TOKEN = "a9aae70d65c928a554f9a038b9d4703a1583594f" NB_URL = "http://netbox.linkmeup.ru:45127" nb = pynetbox.api(NB_URL, token = API_TOKEN) device_parameters = { "name": "just a simple PYNETBOX girl", "device_type": 1, "device_role": 1, "site": 3, } new_device = nb.dcim.devices.create(**device_parameters) print(new_device) 

Documentation Pynetbox



Swagger


Ce qui vaut d'autre grùce à la derniÚre décennie, ce sont les spécifications de l'API. Si vous suivez ce chemin , vous serez redirigé vers la documentation Swagger UI - Netbox API.



Cette page répertorie tous les points de terminaison, les méthodes de travail avec eux, les paramÚtres et attributs possibles et indique lesquels sont nécessaires. De plus, les réponses attendues sont décrites.



Sur la mĂȘme page, vous pouvez effectuer des requĂȘtes interactives en cliquant sur Essayer .
Pour une raison quelconque, swagger prend le nom du serveur sans port comme URL de base, donc la fonction Try it out ne fonctionne pas dans mes exemples Swagger. Mais vous pouvez l'essayer sur votre propre installation.
Lorsque vous cliquez sur ExĂ©cuter Swagger, l'interface utilisateur gĂ©nĂšre une chaĂźne curl qui peut ĂȘtre utilisĂ©e pour effectuer une demande similaire Ă  partir de la ligne de commande.

Dans Swagger UI, vous pouvez mĂȘme crĂ©er un objet:



Pour ce faire, il suffit d'ĂȘtre un utilisateur autorisĂ© disposant des droits nĂ©cessaires.

Ce que nous voyons sur cette page est l'interface utilisateur Swagger, une documentation générée sur la base des spécifications de l'API.

Avec les tendances de l'architecture des microservices, il devient de plus en plus important d'avoir une API standardisée pour l'interaction entre les composants, dont les points de terminaison et les méthodes sont faciles à déterminer pour la personne et l'application sans fouiller dans le code source ou la documentation PDF.

Par consĂ©quent, les dĂ©veloppeurs suivent aujourd'hui de plus en plus le paradigme API First lorsqu'ils pensent d'abord Ă  l'API, puis seulement Ă  la mise en Ɠuvre.
L'API est d'abord spécifiée dans cette conception, puis la documentation, l'application cliente, la partie serveur sont générées à partir d'elle et des tests sont nécessaires.

Swagger est un langage de cadre et de spĂ©cification (qui a maintenant Ă©tĂ© renommĂ© OpenAPI 2.0), vous permettant de mettre en Ɠuvre cette tĂąche.
Je n'entrerai pas dans les détails.

Pour plus de détails ici:




Critique du REST et des alternatives


Il y en a un, oui. Tout dans ce monde de l'an 2000 n'est pas déjà si rose.

N'étant pas un expert, je ne prétends pas divulguer de maniÚre substantielle la question, mais je donnerai un lien vers un article incontestable sur Habré .

Une interface alternative pour l'interaction des composants du systÚme est aujourd'hui gRPC. Il a également prophétisé un grand avenir dans le domaine des nouvelles approches de l'utilisation des équipements de réseau. Mais nous parlerons de lui dans le futur, à son tour.

Vous pouvez Ă©galement jeter un Ɠil au GraphQL prometteur, mais encore une fois, nous n'avons pas besoin de travailler avec lui pour l'instant, il reste donc Ă  Ă©tudier de maniĂšre indĂ©pendante.



Est important
Le jeton a9aae70d65c928a554f9a038b9d4703a1583594f a été utilisé à des fins de démonstration uniquement et ne fonctionne plus.

L'indication directe de jetons dans le code du programme est inacceptable et je ne l'ai fait ici que pour simplifier les exemples.



Liens utiles



Merci


  • Andrei Panfilov pour la relecture et l'Ă©dition
  • Alexander Fatin pour la relecture et l'Ă©dition

Source: https://habr.com/ru/post/fr485618/


All Articles