


Construisez une API REST à partir de zéro: une introduction
Feb 20, 2025 am 11:48 AM
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
- L'API REST est cruciale pour les services Web modernes et fournit aux développeurs une interface conviviale pour accéder et manipuler les données d'application.
- Les documents sont cruciaux;
- Slim Framework, combiné à des outils tels que idiorm et monologue, peut tirer parti de puissantes capacités de routage et d'intégration de middleware pour faciliter un développement efficace d'API.
- La mise en ?uvre de HTTPS garantit une communication sécurisée et empêche un accès non autorisé aux données transmises entre les clients et les serveurs.
- La gestion des erreurs structurées au format JSON améliore la disponibilité de l'API, fournissant des messages d'erreur clairs et du code qui facilite le débogage et l'intégration.
- L'authentification via des middleware telles que les jetons sur l'authentification de base et le traitement JSON est essentiel pour protéger et gérer efficacement les interactions API.
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 返回聯(lián)系人數(shù)組 /api/contacts/:id GET 返回 ID 為 :id 的聯(lián)系人 /api/contacts POST 添加一個(gè)新聯(lián)系人并返回它(添加了 id 屬性) /api/contacts/:id PUT 更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id PATCH 部分更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id DELETE 刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/star PUT 將 ID 為 :id 的聯(lián)系人添加到收藏夾 /api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/notes GET 返回 ID 為 :id 的聯(lián)系人的筆記 /api/contacts/:id/notes/:nid GET 返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes POST 為 ID 為 :id 的聯(lián)系人添加新筆記 /api/contacts/:id/notes/:nid PUT 更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 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:
{ "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/" } } }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.
SSL est partout
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:
<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 *:80> 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 *:443> 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>
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 返回聯(lián)系人數(shù)組 /api/contacts/:id GET 返回 ID 為 :id 的聯(lián)系人 /api/contacts POST 添加一個(gè)新聯(lián)系人并返回它(添加了 id 屬性) /api/contacts/:id PUT 更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id PATCH 部分更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id DELETE 刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/star PUT 將 ID 為 :id 的聯(lián)系人添加到收藏夾 /api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/notes GET 返回 ID 為 :id 的聯(lián)系人的筆記 /api/contacts/:id/notes/:nid GET 返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes POST 為 ID 為 :id 的聯(lián)系人添加新筆記 /api/contacts/:id/notes/:nid PUT 更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記</code>
Tout d'abord, j'obtiens l'environnement actuel. Si un fichier nommé
{ "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/" } } }
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:
<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 *:80> 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 *:443> 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>
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.
JSON Middleware
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.
// 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']);
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 返回聯(lián)系人數(shù)組 /api/contacts/:id GET 返回 ID 為 :id 的聯(lián)系人 /api/contacts POST 添加一個(gè)新聯(lián)系人并返回它(添加了 id 屬性) /api/contacts/:id PUT 更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id PATCH 部分更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id DELETE 刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/star PUT 將 ID 為 :id 的聯(lián)系人添加到收藏夾 /api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/notes GET 返回 ID 為 :id 的聯(lián)系人的筆記 /api/contacts/:id/notes/:nid GET 返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes POST 為 ID 為 :id 的聯(lián)系人添加新筆記 /api/contacts/:id/notes/:nid PUT 更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 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.
{ "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/" } } }
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 返回聯(lián)系人數(shù)組 /api/contacts/:id GET 返回 ID 為 :id 的聯(lián)系人 /api/contacts POST 添加一個(gè)新聯(lián)系人并返回它(添加了 id 屬性) /api/contacts/:id PUT 更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id PATCH 部分更新 ID 為 :id 的聯(lián)系人 /api/contacts/:id DELETE 刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/star PUT 將 ID 為 :id 的聯(lián)系人添加到收藏夾 /api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人 /api/contacts/:id/notes GET 返回 ID 為 :id 的聯(lián)系人的筆記 /api/contacts/:id/notes/:nid GET 返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes POST 為 ID 為 :id 的聯(lián)系人添加新筆記 /api/contacts/:id/notes/:nid PUT 更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid PATCH 部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記 /api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 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.
{ "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/" } } }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:
<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 *:80> 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 *:443> 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>
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
Quels sont les composants clés de l'API REST?
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.
Comment protéger mon API REST?
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.
Comment version mon API REST?
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.
Comment gérer les erreurs dans l'API REST?
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.
Comment tester mon API REST?
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.
Comment enregistrer mon API REST?
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.
Comment concevoir une API reposante?
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.
Comment paginer les résultats dans mon API REST?
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.
Comment limiter le taux de mon API REST?
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.
Comment déployer mon API REST?
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.
