Maison >développement back-end >tutoriel php >Construisez une API REST à partir de zéro: une introduction

Construisez une API REST à partir de zéro: une introduction

Joseph Gordon-Levitt
Joseph Gordon-Levittoriginal
2025-02-20 11:48:12972parcourir

Build a REST API from Scratch: An 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

  • 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          返回联系人数组
/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.

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:

<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é .php existe, il est chargé, sinon le fichier de configuration par défaut est chargé. Les paramètres spécifiques SLIM sont stockés dans le tableau $ config ['app "] et sont transmis au constructeur de l'application qui étend l'objet mince de base (facultatif mais recommandé). Par exemple, déclaration:

<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.

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.

<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

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn