Maison >développement back-end >tutoriel php >Construisez une API REST à partir de zéro: une introduction
L'écosystème Internet actuel a été complètement modifié par les API, et il y a une bonne raison. En utilisant des API tiers de votre produit ou service, vous pouvez accéder à une large gamme de fonctionnalités utiles, telles que les services d'authentification ou de stockage - qui sont bénéfiques pour vous et vos utilisateurs. En exposant votre propre API, votre application deviendra "une partie de la composition" et l'utilisera d'une manière que vous n'avez jamais pensé ... bien sûr, si vous faites cela de la bonne façon. Dans cette série en deux parties, je vais vous montrer comment créer une couche API RESTful pour votre application PHP en utilisant un ensemble de meilleures pratiques. Le code source complet de ce projet sera fourni à la fin de la partie 2.
Points clés
REST: UI adapté aux développeurs
Tout d'abord, l'API est l'interface utilisateur du développeur, il doit donc être amical, simple, facile à utiliser et bien sûr agréable; Même si ce n'est qu'un fichier de lecture simple mais bien écrit, la documentation est un bon début. La moindre information dont nous avons besoin est un résumé de la portée du service et une liste de méthodes et de points d'accès. Un bon résumé peut être: & gt; Notre application est un service de liste de contacts simple pour gérer les contacts avec les notes associées. Il a deux types d'objets, contacts et notes. Chaque contact a des attributs de base tels que le prénom, le nom de famille et l'adresse e-mail. De plus, chaque contact peut avoir plusieurs notes au format Markdown qui lui sont associées.
Ensuite, il est préférable d'énumérer toutes les ressources et opérations que nous allons mettre en œuvre. Cela peut être considéré comme un équivalent à la visualisation du wireframe d'application. En suivant les principes clés du repos, chaque ressource est représentée par une URL où l'opération est la méthode HTTP utilisée pour y accéder. Par exemple, GET / API / CONTACTS / 12 récupérera un contact avec l'ID 12, tandis que Put / API / Contacts / 12 mettra à jour le même contact. La liste complète des méthodes est la suivante:
<code>URL HTTP Method Operation /api/contacts GET 返回联系人数组 /api/contacts/:id GET 返回 ID 为 :id 的联系人 /api/contacts POST 添加一个新联系人并返回它(添加了 id 属性) /api/contacts/:id PUT 更新 ID 为 :id 的联系人 /api/contacts/:id PATCH 部分更新 ID 为 :id 的联系人 /api/contacts/:id DELETE 删除 ID 为 :id 的联系人 /api/contacts/:id/star PUT 将 ID 为 :id 的联系人添加到收藏夹 /api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人 /api/contacts/:id/notes GET 返回 ID 为 :id 的联系人的笔记 /api/contacts/:id/notes/:nid GET 返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes POST 为 ID 为 :id 的联系人添加新笔记 /api/contacts/:id/notes/:nid PUT 更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Pour une documentation plus complète et professionnelle, vous pouvez envisager d'utiliser des outils comme Swagger, APIDOC ou Google API Discovery Service: Vos utilisateurs vous aimeront!
Outils et paramètres
L'outil principal que j'utiliserai pour construire l'API est le framework Slim. Pourquoi? & gt; [il] vous aide à écrire rapidement des applications Web et des API.
C'est vrai. Ses puissantes capacités de routage facilitent les méthodes d'utilisation autres que GET et POST, il fournit une prise en charge intégrée pour le remplacement de la méthode HTTP (via les en-têtes HTTP et les champs de post cachés) et peut être accroché avec des middleware et des fonctionnalités supplémentaires pour activer le programme d'applications et l'API Le développement est vraiment facile. Avec Slim, j'utilise idiorm pour accéder à la couche de base de données et à la journalisation à l'aide de Monolog. Par conséquent, notre fichier composer.json ressemblera à ceci:
<code class="language-json">{ "name": "yourname/my-contacts", "description": "Simple RESTful API for contacts management", "license": "MIT", "authors": [ { "name": "Your Name", "email": "you@yourdomain.com" } ], "require": { "slim/slim": "*", "slim/extras": "*", "slim/middleware": "*", "monolog/monolog": "*", "j4mie/paris": "*", "flynsarmy/slim-monolog": "*" }, "archive": { "exclude": ["vendor", ".DS_Store", "*.log"] }, "autoload": { "psr-0": { "API": "lib/" } } }</code>Les packages
Slim / Extras et Slim / Middleware fournissent des fonctionnalités utiles telles que la résolution de type de contenu et l'authentification de base. Notre classe personnalisée est située sous l'espace de noms API et dans le répertoire Lib. À ce stade, notre structure de répertoire de travail est la suivante:
<code>bootstrap.php composer.json README.md bin/ import install lib/ API/ public/ .htaccess index.php share/ config/ default.php db/ logs/ sql/ data/ contacts.sql users.sql tables/ contacts.sql notes.sql users.sql ssl/ mysitename.crt mysitename.key</code>
Le contrôleur frontal de notre application est public / index.php, et tout le trafic non-fichier ou répertoire est redirigé ici via des règles de réécriture d'URL standard. Ensuite, j'ai mis tout le code d'initialisation dans bootstrap.php et nous verrons plus tard. Le répertoire de partage contient des données telles que les journaux, les fichiers de configuration, les bases de données SQLite et les fichiers de vidage et les certificats SSL. Le répertoire BIN contient des scripts utilitaires qui utilisent le fichier .sql fourni pour créer une base de données et importer certaines données.
Notre API est accessible uniquement en mode HTTPS et ne nécessite pas de redirection. Cela simplifie la logique d'authentification et empêche les clients mal configurés d'accéder aux points de terminaison non cryptés. Le moyen le plus simple et le plus logique de configurer cette méthode consiste à agir directement sur le serveur Web ou via un serveur proxy. J'utilise l'ancien apache fiable pour ce faire, et mon fichier hôte virtuel ressemble à ceci:
<code class="language-apache"><directory> # Required for mod_rewrite in .htaccess AllowOverride FileInfo Options All -Indexes DirectoryIndex index.php index.shtml index.html <ifmodule php5_module=""> # For Development only! php_flag display_errors On </ifmodule> # Enable gzip compression <ifmodule filter_module=""> AddOutputFilterByType DEFLATE application/json </ifmodule> Order deny,allow Deny from all Allow from 127.0.0.1 </directory> <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev <ifmodule rewrite_module=""> RewriteEngine on ## Throw a 403 (forbidden) status for non secure requests RewriteCond %{HTTPS} off RewriteRule ^.*$ - [L,R=403] </ifmodule> </virtualhost> <ifmodule ssl_module=""> NameVirtualHost *:443 Listen 443 SSLRandomSeed startup builtin SSLRandomSeed connect builtin <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev SSLEngine on SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key SetEnv SLIM_MODE development </virtualhost> </ifmodule></code>
Définissez d'abord les paramètres du répertoire afin qu'ils soient communs aux versions HTTP et HTTPS de notre site. Dans une configuration d'hôte non sécurisée, j'utilise mod_rewrite pour délivrer une erreur d'interdiction 403 pour toute connexion non sécurisée, puis dans la section de sécurité, j'ai configuré SSL avec mon certificat auto-signé, ainsi que la variable SLIM_ENV qui indique qui indique Mince le mode d'application actuel. Pour plus d'informations sur la façon de créer un certificat auto-signé sur Apache et l'installer, consultez cet article sur SSLShopper. Maintenant que nous avons un objectif clair, une structure de répertoire de base et des paramètres de serveur, exécutons Composer.phar Installer et commençons à écrire du code.
Programme de démarrage et contrôleur frontal
Comme mentionné précédemment, le fichier bootstrap.php est responsable du chargement des paramètres de notre application et de nos paramètres d'autoloader.
<code>URL HTTP Method Operation /api/contacts GET 返回联系人数组 /api/contacts/:id GET 返回 ID 为 :id 的联系人 /api/contacts POST 添加一个新联系人并返回它(添加了 id 属性) /api/contacts/:id PUT 更新 ID 为 :id 的联系人 /api/contacts/:id PATCH 部分更新 ID 为 :id 的联系人 /api/contacts/:id DELETE 删除 ID 为 :id 的联系人 /api/contacts/:id/star PUT 将 ID 为 :id 的联系人添加到收藏夹 /api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人 /api/contacts/:id/notes GET 返回 ID 为 :id 的联系人的笔记 /api/contacts/:id/notes/:nid GET 返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes POST 为 ID 为 :id 的联系人添加新笔记 /api/contacts/:id/notes/:nid PUT 更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Tout d'abord, j'obtiens l'environnement actuel. Si un fichier nommé
<code class="language-json">{ "name": "yourname/my-contacts", "description": "Simple RESTful API for contacts management", "license": "MIT", "authors": [ { "name": "Your Name", "email": "you@yourdomain.com" } ], "require": { "slim/slim": "*", "slim/extras": "*", "slim/middleware": "*", "monolog/monolog": "*", "j4mie/paris": "*", "flynsarmy/slim-monolog": "*" }, "archive": { "exclude": ["vendor", ".DS_Store", "*.log"] }, "autoload": { "psr-0": { "API": "lib/" } } }</code>
Configurez un journal monologue qui écrit dans le fichier de l'application / path / share / logs / envname_yyyy-mm-dd.log. Ensuite, après quelques améliorations (vous pouvez les voir dans le code source), j'obtiens l'écrivain de journal généré et j'essaie de me connecter à la base de données:
<code>bootstrap.php composer.json README.md bin/ import install lib/ API/ public/ .htaccess index.php share/ config/ default.php db/ logs/ sql/ data/ contacts.sql users.sql tables/ contacts.sql notes.sql users.sql ssl/ mysitename.crt mysitename.key</code>
Enfin, j'ai ajouté le middleware requis à mon instance d'application. Le middleware de Slim est comme une couche d'oignon, le premier middleware que vous ajoutez sera la couche la plus intérieure, donc l'ordre de notre middleware est important. J'utilise le middleware suivant dans notre API: - Cache (niveau intérieur); - ContentTypes: Paris du format JSON du client; Body "Middleware de l'utilité des meilleures pratiques; - Authentification (couche la plus externe). Nous écrire tout cela, à l'exception des contenus préexistants. À la fin du fichier bootstrap, je définis deux variables globales $ app (AP) et $ log (journal de journal). Le fichier est chargé par notre contrôleur frontal index.php, et quelque chose de magique se produit dans ce fichier.
Structure de routage
Slim a une belle fonctionnalité appelée Route Group. En utilisant cette fonctionnalité, nous pouvons définir nos itinéraires d'application comme ceci:
<code class="language-apache"><directory> # Required for mod_rewrite in .htaccess AllowOverride FileInfo Options All -Indexes DirectoryIndex index.php index.shtml index.html <ifmodule php5_module=""> # For Development only! php_flag display_errors On </ifmodule> # Enable gzip compression <ifmodule filter_module=""> AddOutputFilterByType DEFLATE application/json </ifmodule> Order deny,allow Deny from all Allow from 127.0.0.1 </directory> <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev <ifmodule rewrite_module=""> RewriteEngine on ## Throw a 403 (forbidden) status for non secure requests RewriteCond %{HTTPS} off RewriteRule ^.*$ - [L,R=403] </ifmodule> </virtualhost> <ifmodule ssl_module=""> NameVirtualHost *:443 Listen 443 SSLRandomSeed startup builtin SSLRandomSeed connect builtin <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev SSLEngine on SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key SetEnv SLIM_MODE development </virtualhost> </ifmodule></code>
J'ai créé deux groupes imbriqués / API et / V1 afin que nous puissions facilement adhérer aux meilleures pratiques "Contrôle de version dans URL". J'ai également créé des itinéraires facultatifs pour / API / qui peuvent contenir du contenu lisible par l'utilisateur, ainsi qu'une URL racine courante (/) qui dans le monde réel peut contenir l'interface utilisateur publique de l'application.
Mon approche initiale a été d'utiliser le middleware de routage (un autre middleware millé) dans le groupe / V1 pour l'authentification et la demande / réponse JSON, mais j'ai trouvé plus pratique et concise d'utiliser des middleware classiques. Comme mentionné précédemment, Middleware est une instance d'une classe héritée de Slimmiddleware. La méthode Call () du middleware Slim est l'endroit où l'opération se produit.
<code class="language-php">// Init application mode if (empty($_ENV['SLIM_MODE'])) { $_ENV['SLIM_MODE'] = (getenv('SLIM_MODE')) ? getenv('SLIM_MODE') : 'development'; } // Init and load configuration $config = array(); $configFile = dirname(__FILE__) . '/share/config/' . $_ENV['SLIM_MODE'] . '.php'; if (is_readable($configFile)) { require_once $configFile; } else { require_once dirname(__FILE__) . '/share/config/default.php'; } // Create Application $app = new API\Application($config['app']);</code>
Notre middleware JSON met en œuvre deux meilleures pratiques: "JSON Response Only" et "JSON Encoding Body". La méthode est la suivante:
<code>URL HTTP Method Operation /api/contacts GET 返回联系人数组 /api/contacts/:id GET 返回 ID 为 :id 的联系人 /api/contacts POST 添加一个新联系人并返回它(添加了 id 属性) /api/contacts/:id PUT 更新 ID 为 :id 的联系人 /api/contacts/:id PATCH 部分更新 ID 为 :id 的联系人 /api/contacts/:id DELETE 删除 ID 为 :id 的联系人 /api/contacts/:id/star PUT 将 ID 为 :id 的联系人添加到收藏夹 /api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人 /api/contacts/:id/notes GET 返回 ID 为 :id 的联系人的笔记 /api/contacts/:id/notes/:nid GET 返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes POST 为 ID 为 :id 的联系人添加新笔记 /api/contacts/:id/notes/:nid PUT 更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Nous pouvons passer le chemin racine au constructeur du middleware. Dans ce cas, je passe / API / V1 afin que notre middleware ne soit appliqué qu'à la partie API de notre site. Si le chemin actuel correspond à l'en-tête de type de contenu de réponse, l'en-tête de type de contenu de réponse est obligé d'être application / JSON et je vérifie la méthode de demande. Si la méthode de demande est l'une des méthodes de demande qui permettent les écritures (put, post, patch), l'en-tête de type de contenu de demande doit être l'application / JSON, sinon l'application quittera et affichera le code d'état HTTP 415 non pris en charge. Si tout fonctionne bien, la déclaration $ this- & gt; next- & gt; Call () exécutera le prochain middleware de la chaîne.
Authentification
Étant donné que notre application s'exécutera sur HTTPS par défaut, j'ai décidé d'utiliser une méthode où les jetons ont la priorité sur l'authentification de base: les clés API sont envoyées au champ de nom d'utilisateur de l'en-tête HTTP Auth de base (aucun mot de passe requis)). Pour ce faire, j'ai écrit une classe middleware mildide appelée Tokenoverbasiconuth en modifiant le httpbasicauth mince existant. Ce middleware fonctionne en premier dans la chaîne, il est donc ajouté comme le dernier, et il prend un paramètre de chemin racine facultatif dans le constructeur.
<code class="language-json">{ "name": "yourname/my-contacts", "description": "Simple RESTful API for contacts management", "license": "MIT", "authors": [ { "name": "Your Name", "email": "you@yourdomain.com" } ], "require": { "slim/slim": "*", "slim/extras": "*", "slim/middleware": "*", "monolog/monolog": "*", "j4mie/paris": "*", "flynsarmy/slim-monolog": "*" }, "archive": { "exclude": ["vendor", ".DS_Store", "*.log"] }, "autoload": { "psr-0": { "API": "lib/" } } }</code>
Cette méthode recherche l'en-tête de demande PHP_auth_user pour le jeton AUTH, et s'il n'existe pas ou est invalide, transmet l'en-tête de statut et d'authentification interdit 401 au client. La méthode Verify () est protégée et peut donc être remplacée par les sous-classes;
<code>bootstrap.php composer.json README.md bin/ import install lib/ API/ public/ .htaccess index.php share/ config/ default.php db/ logs/ sql/ data/ contacts.sql users.sql tables/ contacts.sql notes.sql users.sql ssl/ mysitename.crt mysitename.key</code>Ici, je vérifie simplement l'existence de la clé API dans la table des utilisateurs et si je trouve un utilisateur valide, il est ajouté au contexte de l'application à utiliser avec la couche suivante (Ratelimit). Vous pouvez modifier ou étendre cette classe pour injecter votre propre logique d'authentification ou utiliser le module OAuth. Pour plus d'informations sur OAuth, consultez l'article de Jamie Munro.
Erreur utilisée la charge utile
Notre API doit afficher les messages d'erreur utiles dans un format utilisable, de préférence dans la représentation JSON, si possible. Nous avons besoin d'une charge utile minimale contenant des codes et des messages d'erreur. De plus, les erreurs de vérification nécessitent plus de segmentation. En utilisant SLIM, nous pouvons redéfinir 404 erreurs et erreurs de serveur à l'aide des méthodes $ app- & gt; notfound () et $ app- & gt; error (), respectivement.<code>URL HTTP Method Operation /api/contacts GET 返回联系人数组 /api/contacts/:id GET 返回 ID 为 :id 的联系人 /api/contacts POST 添加一个新联系人并返回它(添加了 id 属性) /api/contacts/:id PUT 更新 ID 为 :id 的联系人 /api/contacts/:id PATCH 部分更新 ID 为 :id 的联系人 /api/contacts/:id DELETE 删除 ID 为 :id 的联系人 /api/contacts/:id/star PUT 将 ID 为 :id 的联系人添加到收藏夹 /api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人 /api/contacts/:id/notes GET 返回 ID 为 :id 的联系人的笔记 /api/contacts/:id/notes/:nid GET 返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes POST 为 ID 为 :id 的联系人添加新笔记 /api/contacts/:id/notes/:nid PUT 更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记 /api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
L'erreur ne se trouve pas plus simple: je reçois d'abord le type de support demandé, puis l'indicateur $ ISAPI me dit si l'URL actuelle est sous le groupe / API / V *. Si le client demande l'URL de l'API ou envoie un en-tête de type de contenu JSON, je retournerai la sortie JSON, sinon je peux rendre le modèle ou simplement imprimer un HTML statique comme indiqué dans cet exemple. D'autres erreurs sont un peu délicates et la méthode $ app- & gt; error () est déclenchée lorsqu'une exception se produit, et Slim convertit une erreur PHP standard en un objet ErrorException. Nous avons besoin d'un moyen de fournir des erreurs utiles aux clients sans exposer trop de mécanismes internes pour éviter les vulnérabilités de sécurité. Pour cette application, j'ai créé deux exceptions personnalisées, apiexception et apiexceptionValidationException, qui sont exposées au public, tous les autres types d'exceptions sont enregistrés dans le journal et sont affichés uniquement en mode développement.
<code class="language-json">{ "name": "yourname/my-contacts", "description": "Simple RESTful API for contacts management", "license": "MIT", "authors": [ { "name": "Your Name", "email": "you@yourdomain.com" } ], "require": { "slim/slim": "*", "slim/extras": "*", "slim/middleware": "*", "monolog/monolog": "*", "j4mie/paris": "*", "flynsarmy/slim-monolog": "*" }, "archive": { "exclude": ["vendor", ".DS_Store", "*.log"] }, "autoload": { "psr-0": { "API": "lib/" } } }</code>La méthode
$ app- & gt; error () reçoit l'exception lancée en tant que paramètre. Par défaut, j'obtiens toutes les données dont j'ai besoin et remplit le tableau d'erreur $, puis si je suis en mode de production, je vous déclencherai les données privées et réécrivez le message avec les données générales. La classe Custom ValidationException a une méthode GetData () personnalisée qui renvoie un tableau d'erreurs de validation ajoutées à la charge utile finale. Ensuite, affichez l'erreur dans JSON ou HTML en fonction de la demande. Du côté de l'API, nous pouvons avoir une erreur simple comme suit:
<code>bootstrap.php composer.json README.md bin/ import install lib/ API/ public/ .htaccess index.php share/ config/ default.php db/ logs/ sql/ data/ contacts.sql users.sql tables/ contacts.sql notes.sql users.sql ssl/ mysitename.crt mysitename.key</code>
ou une erreur de vérification complète comme indiqué ci-dessous:
<code class="language-apache"><directory> # Required for mod_rewrite in .htaccess AllowOverride FileInfo Options All -Indexes DirectoryIndex index.php index.shtml index.html <ifmodule php5_module=""> # For Development only! php_flag display_errors On </ifmodule> # Enable gzip compression <ifmodule filter_module=""> AddOutputFilterByType DEFLATE application/json </ifmodule> Order deny,allow Deny from all Allow from 127.0.0.1 </directory> <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev <ifmodule rewrite_module=""> RewriteEngine on ## Throw a 403 (forbidden) status for non secure requests RewriteCond %{HTTPS} off RewriteRule ^.*$ - [L,R=403] </ifmodule> </virtualhost> <ifmodule ssl_module=""> NameVirtualHost *:443 Listen 443 SSLRandomSeed startup builtin SSLRandomSeed connect builtin <virtualhost> ServerAdmin you@yourdomain.com DocumentRoot "/path/to/MyApp/public" ServerName myapp.dev SSLEngine on SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key SetEnv SLIM_MODE development </virtualhost> </ifmodule></code>
Conclusion
Nous avons maintenant le cœur de l'API. Dans la section suivante, nous ajouterons du contenu pour avoir un service entièrement fonctionnel. Pendant ce temps, n'hésitez pas à lire les articles liés dans cette section - ils sont un trésor de principes de conception d'API utiles.
FAQ (FAQ) sur la construction d'API REST à partir de zéro
L'API REST se compose de plusieurs composants clés. Le premier est la méthode HTTP, qui définit le type de fonctionnement à effectuer. Il s'agit notamment de Get, Post, Put, Supprimer, etc. Le deuxième composant est une URL ou URI, qui est l'identifiant de ressource. Le troisième composant est l'en-tête HTTP, qui porte les métadonnées des demandes et réponses HTTP. Le quatrième composant est le corps ou la charge utile, qui transporte les données réelles à transmettre. Enfin, le code d'état indique le succès ou l'échec de la demande HTTP.
La protection de votre API REST est essentielle pour protéger les données sensibles. Vous pouvez utiliser diverses méthodes telles que les clés API, OAuth ou JWT pour l'authentification et l'autorisation. De plus, le transfert de données est toujours utilisé pour assurer l'intégrité des données et la confidentialité. Mettez régulièrement à mettre à jour et à corriger votre API et ses dépendances pour protéger contre les vulnérabilités.
Le versioning de votre API REST vous permet d'introduire des modifications non destructives sans affecter les clients existants. Vous pouvez verser l'API en incluant le numéro de version dans l'URL ou en utilisant un en-tête de demande personnalisé. N'oubliez pas de enregistrer toutes les modifications et d'informer vos consommateurs d'API de la nouvelle version et de leurs fonctionnalités.
Gestion des erreurs correctes dans l'API REST améliore sa convivialité et sa fiabilité. Utilisez un code d'état HTTP pour indiquer le type d'erreur. Incluez un message d'erreur dans le corps de réponse pour plus de détails sur l'erreur. Cela aide le client à comprendre ce qui ne va pas et comment résoudre le problème.
Testez votre API REST pour vous assurer qu'elle fonctionne comme prévu et peut gérer une variété de scénarios. Vous pouvez utiliser des outils comme Postman ou Curl pour des tests manuels. Pour les tests automatisés, envisagez d'utiliser des tests unitaires, des tests d'intégration et des tests de bout en bout. Utilisez un serveur simulé pour simuler les réponses de l'API et tester comment votre API gère différents types de réponses.
Une bonne documentation rend votre API de repos facile à comprendre et à utiliser. Comprend des informations détaillées sur les points de terminaison, les méthodes de demande, les paramètres de demande, les exemples de demande, les codes d'état de réponse et les exemples de réponse. Vous pouvez utiliser des outils comme Swagger ou Postman pour générer et héberger vos documents API.
Les API reposantes de conception impliquent des ressources de planification, des points de terminaison et des méthodes. Utilisez des noms pour les ressources et les méthodes HTTP pour les opérations. Gardez l'API simple et intuitive. Utilisez des codes d'état pour indiquer le résultat de la demande. Rendez votre API sans état, ce qui signifie que chaque demande doit contenir toutes les informations dont vous avez besoin pour traiter la demande.
La pagination aide à limiter la quantité de données renvoyées en une seule réponse. Vous pouvez implémenter la pagination à l'aide de paramètres de requête tels que "page" et "limite". Incluez les métadonnées dans l'en-tête ou le corps de réponse pour indiquer la page actuelle, le nombre total de pages, le nombre total d'éléments, etc.
La limitation du taux protège votre API REST contre les abus et assure une utilisation équitable. Vous pouvez limiter le nombre de demandes en fonction de votre adresse IP, de votre clé API ou de votre compte utilisateur. Utilisez des en-têtes HTTP pour communiquer le statut de limitation de taux au client.
Vous pouvez déployer votre API REST sur un serveur ou une plate-forme cloud. Lors de la sélection des options de déploiement, considérez des facteurs tels que le coût, l'évolutivité et la sécurité. Utilisez des outils d'intégration continue et de livraison continue (CI / CD) pour automatiser le processus de déploiement. Surveillez vos performances et votre utilisation API pour vous assurer qu'elle répond aux besoins de vos utilisateurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!