Programmation avec Yii2 Construction d'une API RESTful

Ce que vous allez créer

Dans ce Programmation avec la série Yii2, Je guide les lecteurs dans l'utilisation du framework Yii2 pour PHP. Vous pouvez également être intéressé par mon Introduction au framework Yii, qui passe en revue les avantages de Yii et inclut un aperçu des nouveautés de Yii 2.x.

Dans le tutoriel d'aujourd'hui, je vais expliquer comment créer une API REST dans Yii pour connecter votre application au cloud, aux applications mobiles et à d'autres services. Je vais vous guider à travers le guide de démarrage rapide de l'API REST de Yii et vous fournir un contexte et des exemples de requêtes courantes..

Mise en route des API Yii REST

Construire des API REST dans Yii est en réalité assez simple. Vous pouvez exploiter le framework MVC existant, mais vous créez un point d'accès distinct auquel vous souhaitez accéder par différents types de services (pas les visiteurs du site Web)..

Les avantages du framework Yii REST

Le framework Yii fournit un support étendu et une documentation détaillée pour la construction d'API. Voici certaines des fonctionnalités intégrées lors de la création d'API:

  • Prototypage rapide avec prise en charge des API communes pour Active Record. Cela vous permet d'exposer rapidement et facilement les fonctionnalités CRUD des modèles de données via une API..
  • Négociation du format de réponse (prenant en charge JSON et XML par défaut). Il existe un support intégré pour le retour des données dans des formats de sortie communs.
  • Sérialisation d'objet personnalisable avec prise en charge de champs de sortie sélectionnables. Il est facile de modifier les données renvoyées.
  • Formatage correct des données de collecte et des erreurs de validation.
  • Prise en charge d'Hypermedia en tant que moteur de l'état de l'application (HATEOAS)
  • Routage efficace avec vérification du verbe HTTP appropriée.
  • Prise en charge intégrée du OPTIONS et TÊTE verbes.
  • Authentification et autorisation.
  • Mise en cache des données et mise en cache HTTP.
  • Limitation de débit.

Je n'aurai pas l'occasion de parler de tout cela aujourd'hui.

Mon intérêt pour les API REST

Dans cet épisode, je construirai une API pour nous permettre de manipuler la table d'éléments que j'ai créée dans le service Twixxr à partir de ce tutoriel sur les API Twitter. Mais je prévois également de construire une API pour notre série de didacticiels de démarrage, Meeting Planner. Une API sécurisée sera nécessaire pour créer une application iOS pour le service. L'API permettra la communication entre l'application mobile et le service cloud.

Construire le contrôleur REST

Avec la structure REST de Yii, nous allons créer un point de terminaison pour notre API et organiser les contrôleurs pour chaque type de ressource..

Les ressources sont essentiellement les modèles de données de notre application. Ceux-ci étendent yii \ base \ Model. 

La classe yii \ rest \ UrlRule fournit un routage prêt à l'emploi mappant notre modèle de données aux points de terminaison API CRUD:

Création d'un arbre destiné à servir de point de terminaison d'API

Dans le modèle Yii2 Advanced, il existe une arborescence front-end et back-end, extensible. Pour séparer les fonctionnalités de l'API, nous allons créer une troisième arborescence servant uniquement de point de terminaison d'API.. 

Le développeur de Yii, Alex Makarov, fournit ce guide utile pour créer des arbres supplémentaires que j'ai suivis pour créer mon troisième arbre:

$ cp -R backend api $ cp -R environnements / dev / backend / environnements / dev / api $ cp -R environnements / prod / backend / environnements / prod / api 

Ensuite, j'ai utilisé l'éditeur Atom pour effectuer une recherche globale et remplacer "backend" par "api" dans le nouvel arbre api.

Et j'ai ajouté l'alias api à /common/config/bootstrap.php:

Configuration du routage d'URL pour les demandes entrantes

Dans /api/config/main.php, nous devons ajouter le demande[] pour analyser la configuration JSON et l'analyse UrlRule associer des méthodes pour les modèles et leurs extrémités:

return ['id' => 'app-api', 'basePath' => dirname (__ DIR__), 'controllerNamespace' => 'api \ controllers', 'bootstrap' => ['log'], 'modules' => [], 'composants' => ['request' => ['analyseurs' => ['application / json' => 'yii \ web \ JsonParser',],], 'urlManager' => ['enablePrettyUrl' = > true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [['class' => 'yii \ rest \ UrlRule', 'controller' => 'item'], ['class '=>' yii \ rest \ UrlRule ',' controller '=>' user '],],], 

C'est tout ce qu'il faut pour activer certaines fonctionnalités API riches pour ces modèles..

Exemples avec cURL

Commençons à faire des demandes.

Demander des OPTIONS

Montrez-moi les méthodes d'API disponibles:

curl -i -H "Accepter: application / json" -X OPTIONS "http: // localhost: 8888 / api / items"

Voici la réponse (GET, POST, HEAD, OPTIONS):

HTTP / 1.1 200 OK Date: mar 25 oct 2016 20:23:10 Serveur GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Autoriser: OBTENIR, POST, EN-TÊTE, OPTIONS Content-Length: 0 Content-Type: application / JSON; jeu de caractères = UTF-8 

Requêtes GET

Requête: combien de données y a-t-il??

curl -i --head "http: // localhost: 8888 / api / items"

Réponse: 576 enregistrements sur 29 pages…

HTTP / 1.1 200 OK Date: mardi 25 octobre 2016 23:17:37 Serveur GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 X-Pagination-Total-Count: 576 X-Pagination-Page-Count: 29 X- Pagination-Current-Page: 1 X-Pagination-Per-Page: 20 Lien: ; rel = soi, ; rel = next, ; rel = dernier type de contenu: application / json; jeu de caractères = UTF-8 

Demande: Montre-moi la fiche 15:

curl -i "http: // localhost: 8888 / api / items / 15"

Réponse:

HTTP / 1.1 200 OK Date: Mar 25 Oct 2016 23:19:27 Serveur GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Longueur du contenu: 203 Contenu-Type: application / json; charset = UTF-8 "id": 15, "titre": "Jeff Reifman", "chemin": "jeffreifman", "détail": "", "statut": 0, "posted_by": 1, "image_url ":" "," favoris ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0," created_at ": 1477277956," updated_at ": 1477277956 

Demande: Montrez-moi toutes les données à la page 3:

curl -i -H "Accepter: application / json" "http: // localhost: 8888 / api / items? page = 3"

Réponse:

HTTP / 1.1 200 OK Date: Mar 25 Oct 2016 23:30:21 Serveur GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0. 2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 X-Pagination-Total-Count: 575 X-Pagination-Page-Count: 29 X- Pagination-Current-Page: 3 X-Pagination-Per-Page: 20 Lien: ; rel = soi, ; rel = premier, ; rel = prev, ; rel = next, ; rel = last Content-Length: 3999 Type de contenu: application / json; charset = UTF-8 ["id": 43, "titre": "_ jannalynn", "chemin": "_ jannalynn", "détail": "", "statut": 0, "posté_by": 1, "image_url ":" "," favoris ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 ": 0,… " id ": 99," titre ":" alibrown "," chemin ":" alibrown "," detail ":" "," status ": 0," posted_by ": 1," image_url ":" "," favorites ": 0," stat_1 ": 0," stat_2 ": 0," stat_3 " : 0, "created_at": 1477277956, "updated_at": 1477277956]

SUPPRIMER les demandes

Voici un exemple de demande GET suivie d'une demande DELETE puis d'une tentative GET ayant échoué par la suite:

$ curl -i -H "Accepter: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 200 OK Date: mar., 25 oct. 2016 23:32:17 Serveur GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 Exploité par X -By: PHP / 7.0.10 Longueur du contenu: 186 Type du contenu: application / json; charset = UTF-8 "id": 8, "titre": "aaker", "chemin": "aaker", "détail": "", "statut": 0, "posted_by": 1, "image_url" : "", "favoris": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477277956, "updated_at": 1477277956 $ curl -i -H "Accepter: application / json "-X DELETE" http: // localhost: 8888 / api / items / 8 "HTTP / 1.1 204 pas de contenu Date: mar, 25 oct 2016 23:32:26 Serveur GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0 .10 Longueur du contenu: 0 Type du contenu: application / json; charset = UTF-8 $ curl -i -H "Accepter: application / json" "http: // localhost: 8888 / api / items / 8" HTTP / 1.1 404 Introuvable Date: mar, 25 oct 2016 2016 23:32: 28 Serveur GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 X-Powered-By: PHP / 7.0.10 Contenu-Length: 115 Content-Type: application / json; charset = UTF-8 "name": "Introuvable", "message": "Objet non trouvé: 8", "code": 0, "status": 404, "type": "yii \\ web \\ NotFoundHttpException " 

Les demandes d'enregistrement effacé renvoient une erreur 404.

Requêtes POST

Pour mes demandes de publication, je suis passé à l'application Chrome Postman:

S'inscrire à Postman était facile:

Et puis j'ai pu soumettre des demandes à mon API localhost dans une interface graphique plus conviviale:

Ensuite, j'ai récupéré les données via curl, fiche 577:

$ curl -i -H "Accepter: application / json" "http: // localhost: 8888 / api / items / 577" HTTP / 1.1 200 OK Date: mar, 25 oct 2016 23:40:44 Serveur GMT: Apache / 2.2.31 (Unix) mod_wsgi / 3.5 Python / 2.7.12 PHP / 7.0.10 mod_ssl / 2.2.31 OpenSSL / 1.0.2h DAV / 2 mod_fastcgi / 2.4.6 mod_perl / 2.0.9 Perl / v5.24.0 Exploité par X -By: PHP / 7.0.10 Longueur du contenu: 219 Type du contenu: application / json; charset = UTF-8 "id": 577, "titre": "Jeff Reifman", "chemin": "reifman", "détail": "Un programmeur sur terre.", "status": 0, "posté_par" : 1, "image_url": "", "favoris": 0, "stat_1": 0, "stat_2": 0, "stat_3": 0, "created_at": 1477436477, "updated_at": 1477436477

Postman s'est avéré essentiel pour compléter mes tests, car le curl en ligne de commande n'était pas facile à configurer pour les soumissions POST.

Regarder vers l'avant

Outre sa présentation rapide REST Quickstart, la documentation Yii 2.0 fournit des détails sur un éventail d'autres aspects de la création d'API:

  • Ressources
  • Contrôleurs
  • Routage
  • Format de réponse
  • Authentification
  • Limitation de taux
  • Gestion des versions
  • La gestion des erreurs

J'espère avoir la chance d'en explorer davantage dans les prochains épisodes. Mais certainement, une des prochaines étapes consiste à créer une API pour Meeting Planner dans la série de démarrage..

En conclusion, la construction d'une API REST de base avec le framework Yii MVC est assez simple. L’équipe Yii a fait un excellent travail de normalisation des fonctionnalités pour une exigence très importante, les API REST. J'espère que vous avez aimé apprendre à leur sujet.

Si vous avez des questions ou des suggestions, postez-les dans les commentaires. Si vous souhaitez suivre mes futurs tutoriels et séries d’Envato Tuts +, veuillez visiter la page de mon instructeur ou suivre @reifman. Vérifiez certainement ma série de démarrage et planificateur de réunion.

Liens connexes

  • Yii2 Developer Exchange, mon site de ressources Yii2
  • Démarrage rapide - Services Web RESTful - Le guide définitif pour Yii 2.0
  • Google Chrome Store: Application Postman