From b303276454f326a4cf4e7115cb026490ded515de Mon Sep 17 00:00:00 2001 From: Anthony Perso <borghi.ant@gmail.com> Date: Thu, 6 Jul 2023 22:25:41 +0200 Subject: [PATCH] ajout doc API Rest --- source/concept/rest/general.md | 120 +++++++++++++++++++++++ source/concept/rest/images/archi-api.png | Bin 0 -> 28046 bytes source/concept/rest/index.rst | 14 +++ 3 files changed, 134 insertions(+) create mode 100644 source/concept/rest/general.md create mode 100644 source/concept/rest/images/archi-api.png create mode 100644 source/concept/rest/index.rst diff --git a/source/concept/rest/general.md b/source/concept/rest/general.md new file mode 100644 index 0000000..38d7653 --- /dev/null +++ b/source/concept/rest/general.md @@ -0,0 +1,120 @@ +# Introduction + +## Qu'est ce qu'une API ? + +En réalité, l’API ou Application Program Interface est, comme son nom l’indique, une interface servant à communiquer entre deux ou plusieurs applications (appareils, services, etc.) distinctes. Elle permet d’effectuer une requête spécifique et de recevoir une réponse, formulée sous un format établi. + +Elle se base donc sur une architecture client-serveur, sur laquelle le client est celui qui effectue la demande et le serveur, celui qui traite et renvoie la réponse. Le client n’a pas à se soucier de la manière dont ce traitement est fait, mais récupère juste ce qu’il a demandé. Le programme du côté du serveur peut donc être élaboré et écrit en n’importe quel langage. Cela n’affectera pas la réponse obtenue par le client, et ce, quelles que soient les technologies utilisées par celui-ci. Il suffit que ces technologies puissent interpréter le résultat communiqué et le tour est joué. + +Grâce à cette interface, les développeurs diminuent le volume de code à produire en n’effectuant que les liens entre les différentes APIs nécessaires pour leurs programmes et adaptés à leurs besoins et à ceux de l’entreprise. + +Les API permettent également de réutiliser à mainte reprise la même ressource, ce qui offre une flexibilité importante à chaque ressource. + +## Qu'est ce qu'une API REST ? + +Le mot REST est l’abréviation de Representational State Transfer. Une API est dite RESTful lorsqu’elle répond à certaines contraintes architecturales. En gros, c’est un ensemble de règles à respecter afin de rendre l’interaction entre le client et le serveur le plus flexible, le plus simple et le plus rapide possible. C’est pour cela que les entreprises la préfèrent aux autres manières de faire appel à des APIs. + +Elle se base essentiellement sur le protocole HTTP pour l’envoi de requêtes relatives au CRUD (création, récupération, modification ou suppression). L’interaction avec les ressources basées sur un serveur s’effectue à partir d’un URI. + +Il existe plusieurs formats dans lesquels ces dernières peuvent être retournées, à savoir : JSON, XML, XLT, YAML ou HTML. + +Le rôle premier d’une API REST est de servir d’intermédiaire entre le client et le serveur. C’est-à-dire que c’est elle qui réceptionne les requêtes émises par le client, le transmet à l’entité demandée au serveur, prend les réponses données par ce dernier puis les retransmettent au client. + + + +## Principes clés + +### L'URI comme identifiant de la ressource + +L'URI (ou le endpoint) permet d'identifier clairement un ressources. + +Exemple : **/rest/vx/clients** Permet d'agir sur la ressource gérant les clients. + +L'URI permet également de percevoir les relation entre les objets. + +Exemple : **/rest/vx/clients/{id}/commandes** Permet d'agir sur la ressource gérant les commandes d'un client spécifique. + +### Les verbes HTTP Pour identifier les opérations + +La seconde règle d’une architecture REST est d’utiliser les verbes HTTP existants plutôt que d’inclure l’opération dans l’URI de la ressource. Ainsi, généralement pour une ressource, il y a 4 opérations possibles (CRUD) : + +- Créer (create) +- Afficher (read) +- Mettre à jour (update) +- Supprimer (delete) + +HTTP propose les verbes correspondant : + +- Créer (create) => POST +- Afficher (read) => GET +- Mettre à jour (update) => PUT +- Supprimer (delete) => DELETE + +### Les réponses HTTP comme représentation de la ressource + +Il est important d’avoir à l’esprit que la réponse envoyée n’est pas une ressource, c’est la représentation d’une ressource. Ainsi, une ressource peut avoir plusieurs représentations dans des formats divers : HTML, XML, CSV, JSON, etc. + +C’est au client de définir quel format de réponse il souhaite reçevoir via l’entêteAccept. Il est possible de définir plusieurs formats. + +### L'utilisation du header authorization pour le jeton de connexion + + il est primordial de sécuriser une API REST. En effet, nous ne sommes jamais à l’abri d’une personne malveillante souhaitant dérober des données que nous exposons, surtout à travers le web. Plusieurs manières sont envisageables et à mettre en place pour qu’une API soit le moins vulnérable possible : + +- Utiliser le protocole HTTPS permet de chiffrer les échanges entre les deux parties, à savoir le client et le serveur ; +- Mettre en place un système d’authentification limite les personnes pouvant échanger avec l’API. Vous pouvez pour cela utiliser, par exemple, Json Web Token (JWT). JWT sert à identifier un utilisateur et à lui donner l’accès à l’API sur une durée déterminée. OAuth2 est également un excellent moyen d’authentifier un client pour lui prodiguer les autorisations nécessaires pour la consommation de l’API. +- Utiliser une clé d’API ainsi qu’une clé secrète permet de reconnaitre les applications accédant à l’API. Cela permet également de signer les requêtes effectuées par celles-ci. + +## REST vs SOAP + +La première raison pour laquelle ces deux APIs sont comparées est sans doute que pendant très longtemps, avant l’apparition de l’API REST, SOAP a été la référence en termes d’utilisation des interfaces. En effet, ayant vu le jour en 1998, c’est un protocole se basant sur XML permettant d’interagir avec de nombreuses sortes d’autres protocoles tels que HTTP, UDP, TCP, etc. + +Cependant, malgré cette puissance qu’il détient, SOAP a tendance à occuper plus de bande passante et par conséquent de devenir assez lent. De plus, il nécessite l’apprentissage du XML et une certaine coordination entre le concepteur du code client et serveur afin d’éviter les erreurs qui peuvent être fatales pour chacun d’eux. Il n’est donc pas assez flexible pour que les applications actuelles puissent évoluer. + +C’est à cause de tout cela que, de nos jours, la plupart des développeurs privilégient l’utilisation d’une API RESTful. + +# Conception d'une API REST + +## Ressources + +La première étape consiste à identifier les ressources exploitables à travers l'API et comment elles sont exploitables. + +Cette étape est à mettre en lien avec les droits sur la Base de données ou les droits sur le système de fichier. + +## Endpoint et opération + +Il faut ensuite définir les endpoints, c'est à dire les ressources et les relations à mettre en place, à partir de là les endpoint devrait apparaitre de manière trés simple. + +Les opérations seront quant à elles le prolongement direct des droits sur votre base de onnées pour chacune des ressources. + +## Requêtes + +Reste à mettre en place les contraintes techniques lié au développement d'un API REST : + +- Format consommable en entrée : + - Query parameters + - Headers + - Content-type acceptables en entrée +- Format de donnée délivrable en sortie +- Authentification +- Headers de sécurité + +# Spécificité d'une API Vitis + +L'API PHP de Vitis va vous permettre de définir vos ressources et des les rendre exploitables facilement. + +Au niveau des spécificté s des requêtes : +- En entrée sont pris en compte + - les query parameters + - Les body dont le content-type est de type + - Multipart/Form-data + - application/x-www-urlencode + - application/json +- Le header accpet permet de définir le format de récupération de la donnée, deux valeur possible : + - application/json + - application/xml +- Un token JWE ou systéme custom équivalent est utilisé pour gérer l'authentification. + + +Une bonne partie de la sécurité est géré en flux commun avant l'arrivée dans votre code. + +Le tout s'appuyant sur le framework Symfony. \ No newline at end of file diff --git a/source/concept/rest/images/archi-api.png b/source/concept/rest/images/archi-api.png new file mode 100644 index 0000000000000000000000000000000000000000..0438d03e8d6a564d345e4d779ff96dd450985149 GIT binary patch literal 28046 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 Dvi2Ze literal 0 HcmV?d00001 diff --git a/source/concept/rest/index.rst b/source/concept/rest/index.rst new file mode 100644 index 0000000..3bfa1a2 --- /dev/null +++ b/source/concept/rest/index.rst @@ -0,0 +1,14 @@ +API REST +============================================ + + +Nous allons parler ici de la conception d'une API REST. + +A quoi ça sert, pourquoi l'utiliser, comment ça fonctionne ? + +============================================ + +.. toctree:: + :maxdepth: 2 + + general.md \ No newline at end of file -- GitLab