Utilisation de services RESTful dans CodeIgniter

CodeIgniter est de plus en plus reconnu pour sa puissance en tant que framework d’applications Web basé sur PHP, mais il est rare que nous voyions des exemples de celui-ci utilisé pour autre chose. Aujourd'hui, nous allons apprendre à utiliser CodeIgniter pour créer une API RESTful pour vos applications Web existantes et à montrer comment interagir avec votre propre API ou d'autres services Web RESTful, tels que Facebook et Twitter..

Comme vous le savez peut-être, vous trouverez une large sélection de scripts et d'applications CodeIgniter sur Envato Market: scripts d'adhésion, gestionnaires de menus, etc..

Détails du tutoriel

  • Programme: CodeIgniter, serveur CodeIgniter REST et client CodeIgniter REST
  • Difficulté: Moyen
  • Temps d'exécution estimé: 30 minutes

introduction

Si vous avez suivi le CodeIgniter à partir de zéro Vous savez maintenant qu'il est relativement simple et rapide de créer des applications Web simples, telles que des blogs, des systèmes de gestion de contenu, des sites de brochures, etc. Une chose à laquelle vous n'avez peut-être pas pensé, est d'utiliser CodeIgniter pour créer une API interactive. Après avoir essayé plusieurs implémentations REST existantes, j'ai constaté qu'elles non seulement manquaient de simplicité, mais manquaient de la plupart des fonctionnalités attendues d'une implémentation RESTful; alors j'ai construit le mien. Ce tutoriel vous montrera comment utiliser ce code pour configurer votre API REST et vous montrera comment interagir avec ce dernier à partir de votre application Web..

Hypothèses

  1. Vous avez un serveur Web configuré, localement ou en ligne et vous savez gérer les fichiers qu'il contient..
  2. Vous avez lu quelques tutoriels sur CodeIgniter from Scratch.
  3. Vous savez comment configurer CodeIgniter.
  4. Vous connaissez un peu les services RESTful.

Ce tutoriel est divisé en deux parties. Nous allons commencer par apprendre à créer un service RESTful, puis plus bas, nous allons apprendre à interagir avec celui-ci de différentes manières..

Partie 1 - Création d'une API RESTful

Étape 1: Configuration de la démonstration

Tout d'abord, vous devez télécharger le code codeigniter-restserver à partir de GitHub, l'extraire et le déplacer sur votre serveur..

Lorsque vous ouvrez le dossier, vous verrez l'installation complète de CodeIgniter, destinée à alimenter la démonstration. Cela permet aux utilisateurs de jouer avec la démo REST avant de s’intégrer à votre application existante..

S'ouvrir "application / config / config.php" et configurez base_url pour que les liens fonctionnent. Cette base_url sera différente pour tout le monde et dépend entièrement de l'endroit où vous avez chargé vos fichiers.

Étape 2: les URL

Avec les fichiers extraits et l'ensemble base_url, nous sommes prêts à charger notre installation RESTful CodeIgniter et à consulter la démo fournie. Parcourez l'URL de base, qui est par défaut:

http: // localhost / restserver

Vous trouverez ici quelques exemples de liens vers exemple_api contrôleur, qui peut être trouvé à "application / controllers / example_api.php". Disséquons les URL de ces exemples pour voir ce qui se passe. La première URL est très simple.

Cette URL ressemble beaucoup à toute autre URL CodeIgniter avec un contrôleur et une méthode, mais vous remarquerez dans ce diagramme que la méthode s'appelle une "ressource". REST concerne uniquement les ressources et il s’agit essentiellement d’un nom au sein de votre application, qui interagit avec (ajout, suppression, modification, interrogation) en fonction d’en-têtes HTTP et de chaînes de requête URL ou d’arguments HTTP..

Le format de sortie par défaut est XML, comme nous le voyons dans cet exemple élémentaire. Les autres liens sont légèrement plus grands et montrent comment passer des paramètres et montrer comment le format de sortie peut être modifié dans l'URL:

Normalement, dans CodeIgniter, vous ne faites que transmettre des valeurs de paramètre, mais un contrôleur REST accepte un nombre quelconque de paramètres dans n'importe quel ordre. Pour que cela fonctionne, nous devons passer le nom du paramètre suivi de la valeur par paires.

À la fin de l'URL se trouve le paramètre "format". Ceci est un paramètre réservé qui modifiera le format de sortie des données demandées comme ceci:

En donnant au développeur de l'API et à l'application cliente le choix des formats de données à utiliser, l'API est ouverte à un public beaucoup plus large et peut être utilisée avec davantage de langages de programmation et de systèmes. Ces trois formats ne sont pas les seuls formats pris en charge. L’API REST peut immédiatement utiliser:

  • xml - presque tous les langages de programmation peuvent lire XML
  • JSON - utile pour JavaScript et de plus en plus d'applications PHP.
  • CSV - ouvrir avec des tableurs
  • html - un simple tableau HTML
  • php - Représentation du code PHP pouvant être évalué par eval ()
  • sérialiser - Données sérialisées pouvant être désérialisées en PHP

Bien que l'ajout du format à l'URL ne soit pas techniquement le moyen le plus RESTful de changer de format, il permet de tester facilement le navigateur et permet aux développeurs sans cURL d'effectuer des requêtes GET simples sur l'API. Le moyen le plus reposant est d’envoyer une Type de contenu En-tête HTTP du contrôleur REST à l'aide de cURL, mais cela sera expliqué plus tard..

Étape 3: le code

Maintenant si vous ouvrez application / controllers / example_api.php vous remarquerez immédiatement quelques différences avec les contrôleurs CodeIgniter normaux.

REST_Controller

Dans le modèle MVC, un contrôleur est le point central de la logique. Il est appelé lorsqu'un utilisateur fait une demande, puis, en fonction de la logique du contrôleur, il extrait les données et affiche les vues. CodeIgniter contient sa propre logique pour le fonctionnement d'un contrôleur, mais comme nous faisons quelque chose de différent, nous avons besoin de notre propre bibliothèque REST_Controller pour qu'elle contienne sa propre logique liée à REST. Donc, au lieu d'utiliser simplement:

 

… Vous devrez utiliser:

 

Travailler avec des ressources

Maintenant que votre contrôleur vide est configuré, voici les méthodes ou "ressources". Ceci est probablement la partie la plus déroutante du tutoriel si vous êtes habitué au fonctionnement de CodeIgniter. Fondamentalement, vous prenez les ressources et le verbe HTTP et les combinez pour donner un nom de méthode. Ainsi, les deux exemples que nous avons examinés auparavant avaient une ressource de utilisateur et utilisateurs. Étant donné que ces deux logiciels ont été chargés dans le navigateur, nous savons qu'il utilisait une requête GET. Les deux méthodes ci-dessous sont utilisées:

 

Cela peut sembler un peu étrange, mais cela vous donne la possibilité d'utiliser la même URL et de répondre à la demande en fonction du verbe HTTP utilisé. Si quelqu'un essaie d'accéder à votre API de manière non autorisée (dans cet exemple, PUT ou DELETE), il répondra simplement par un 404. Si vous n'êtes pas sûr des verbes HTTP, laissez-moi vous expliquer..

OBTENIR

Utilisé pour récupérer des informations sur une ressource existante. Ceci est utilisé par les navigateurs lorsque vous entrez une URL et que vous cliquez sur OK, ou lorsque vous cliquez sur un lien, il est donc idéal pour récupérer des informations sur l'une de vos ressources REST (comme un utilisateur)..

POSTER

Utilisé pour mettre à jour une ressource existante avec des informations. Les navigateurs l'utilisent pour soumettre la plupart des types de formulaires sur Internet, bien que certains utilisent également GET en soumettant l'action de formulaire avec une chaîne de requête contenant les données du champ..

METTRE

Moins couramment utilisé et non pris en charge par la plupart des navigateurs, PUT est utilisé pour créer une nouvelle ressource..

EFFACER

Également non utilisé par de nombreux navigateurs, ce verbe HTTP est évidemment utilisé pour supprimer une ressource.

Si nous mettons cela dans le code et permettons à chaque verbe sur la ressource utilisateur cela ressemblerait à ceci:

 

Accéder aux paramètres et renvoyer des données

Alors maintenant, l’API a été structurée en configurant les ressources et en définissant une méthode pour chaque verbe HTTP que nous souhaitons prendre en charge; nous avons besoin de paramètres pour pouvoir utiliser nos modèles et nos bibliothèques CodeIgniter. C'est l'un des principaux avantages de l'utilisation de CodeIgniter pour notre API, car nous pouvons utiliser nos modèles et nos bibliothèques existants sans avoir à les recoder..

get ('id')); $ this-> response ($ data);  function user_post () $ data = array ('retourné:'. $ this-> post ('id')); $ this-> response ($ data);  function user_put () $ data = array ('retourné:'. $ this-> put ('id')); $ this-> response ($ data; function user_delete () $ data = array ('retourné:'. $ this-> delete ('id')); $ this-> response ($ data);

Cet exemple contient cinq nouveaux morceaux de code:

$ this-> get ()

Est utilisé pour renvoyer des variables GET à partir d'une chaîne de requête comme celle-ci index.php / example_api / user? Id = 1 ou peut être définie de la manière la plus commune avec CodeIgniter'esque avec index.php / example_api / user / id / 1.

$ this-> post ()

Est un alias pour $ this-> input-> post () qui est la méthode de CodeIgniter pour accéder aux variables $ _POST avec une protection XSS.

$ this-> put ()

Lit dans les arguments PUT définis dans les en-têtes HTTP ou via cURL.

$ this-> delete ()

Vous l'avez deviné, cela lit dans les arguments DELETE, également définis dans les en-têtes HTTP ou via cURL.

$ this-> response ()

Envoie des données au navigateur dans le format de données demandé ou par défaut en XML. Vous pouvez éventuellement transmettre un code de statut HTTP pour indiquer qu'il a fonctionné ou a échoué. Par exemple, si l'ID fourni n'était pas dans la base de données, vous pouvez utiliser $ this-> response (array ('error' => 'User not found.'), 404);

Étape 4: Travailler avec vos modèles

Jusqu'à présent, nous travaillions avec un exemple d'API lors d'une nouvelle installation. La prochaine étape consiste donc à exécuter une API REST à partir de votre base de code existante..

Bien que le téléchargement vienne avec une installation complète de CodeIgniter pour la démo et pour permettre aux API d'être construites à partir de zéro, les deux seuls fichiers importants sont:

  1. application / config / rest.php
  2. application / libraries / REST_Controller.php

Déposez ces deux fichiers dans votre application CodeIgniter et créez un nouveau contrôleur d'API..

get ('id')) $ this-> response (NULL, 400);  $ user = $ this-> user_model-> get ($ this-> get ('id')); if ($ user) $ this-> response ($ user, 200); // 200 étant le code de réponse HTTP else $ this-> response (NULL, 404);  function user_post () $ result = $ this-> user_model-> update ($ this-> post ('id'), array ('name' => $ this-> post ('name'), 'email '=> $ this-> post (' email '))); if ($ resultat === FALSE) $ this-> response (array ('status' => 'failed'));  else $ this-> response (array ('status' => 'success'));  function users_get () $ users = $ this-> user_model-> get_all (); if ($ utilisateurs) $ this-> response ($ utilisateurs, 200);  else $ this-> response (NULL, 404); ?>

Cela montre un exemple d'API avec certains noms de modèles génériques. Dans la première méthode, nous récupérons un? Id = XX et le transmettons au modèle. Si des données sont trouvées, nous les envoyons à la fonction $ this-> response () avec le statut 200. Si rien n'est trouvé, ne renvoie aucun corps et un 404 pour indiquer que rien n'a été trouvé. Vous pouvez imaginer comment cela pourrait être étendu pour exécuter toutes sortes d'activités API pour votre application Web..

Étape 5: Sécuriser l'API

Maintenant que votre API est construite, elle doit être sécurisée afin que seuls les utilisateurs disposant d'un accès puissent interagir avec l'API. Pour définir le type de connexion, les noms d'utilisateur et les mots de passe s'ouvrent "application / config / rest.php" dans votre base de code.

/ * | --------------------------------------------------- --------------------------- | Connexion REST | --------------------------------------------------- --------------------------- | | Une connexion est-elle requise et si oui, quel type de connexion? | | "= pas de login requis, 'basic' = login relativement sécurisé, 'digest' = login sécurisé | * / $ config ['rest_auth'] = 'basic';

Aucun

Tout le monde peut interagir avec l’un de vos contrôleurs API..

De base

Une méthode de connexion relativement peu sécurisée qui ne devrait être utilisée que sur des réseaux internes / sécurisés.

Digérer

Une méthode de connexion beaucoup plus sécurisée qui chiffre les noms d'utilisateur et mot de passe. Si vous souhaitez avoir une API protégée accessible à tous, utilisez digest.

/ * | --------------------------------------------------- --------------------------- | Noms d'utilisateur de connexion REST | -------------------------------------------------- ---------------------------- | | Tableau de noms d'utilisateur et mots de passe pour la connexion | | tableau ('admin' => '1234') | * / $ config ['rest_valid_logins'] = array ('admin' => '1234');

La configuration des utilisateurs est simple. Chaque connexion est un élément du tableau, avec une clé et une valeur. La clé est le nom d'utilisateur et la valeur est le mot de passe. Ajoutez autant que vous le souhaitez à ce tableau et distribuez-les à quiconque utilisera l'API.

Partie 2 - Interaction avec les services RESTful

Qu'il s'agisse de l'API que vous venez de créer ou d'un service public tel que Twitter, vous souhaiterez pouvoir interagir avec elle d'une manière ou d'une autre. Etant donné que les services RESTful fonctionnent avec des requêtes HTTP de base, il est très facile de le faire de différentes façons..

Différentes méthodes pour interagir avec REST

Chacune de ces différentes méthodes d'interaction sera affichée avec le code placé directement dans les méthodes du contrôleur. Ceci est uniquement pour que les démos soient plus faciles à lire et seraient normalement placés dans un modèle ou une bibliothèque pour une séparation MVC correcte..

file_get_contents ()

En utilisant la très simple fonction PHP file_get_contents (), vous pouvez effectuer une requête GET de base. C’est la plus fondamentale de toutes les méthodes, mais elle mérite d’être mentionnée pour les moments "rapides et sales"..

$ user = json_decode (file_get_contents ('http://example.com/index.php/api/user/id/1/format/json')); echo $ utilisateur-> nom;

Il convient de noter que, si cette méthode ne fonctionnera pas avec l'authentification HTTP Digest, si vous utilisez l'authentification HTTP Basic, vous pouvez utiliser la syntaxe suivante pour obtenir les données de votre API RESTful protégée par mot de passe:

$ user = json_decode (file_get_contents ('http: // admin: [email protected]/index.php/api/user/id/1/format/json')); echo $ utilisateur-> nom;

L'utilisation de cette méthode pose quelques problèmes: le seul moyen de définir des en-têtes HTTP supplémentaires consiste à les définir manuellement à l'aide de la fonction PHP stream_context_create (), ce qui peut s'avérer très compliqué pour les développeurs novices dans le fonctionnement interne des requêtes HTTP. Un autre inconvénient est que vous ne recevez que le corps de la réponse HTTP dans son format brut, ce qui signifie que vous devez gérer la conversion à partir d'une requête très unique..

boucle

cURL est le moyen le plus flexible d'interagir avec une API REST, car elle a été conçue pour ce genre de choses. Vous pouvez définir des en-têtes HTTP, des paramètres HTTP et bien plus encore. Voici un exemple sur la façon de mettre à jour un utilisateur avec example_api et cURL pour effectuer une demande POST:

 function native_curl ($ new_name, $ new_email) $ username = 'admin'; $ password = '1234'; // Version JSON alternative // ​​$ url = 'http://twitter.com/statuses/update.json'; // Configurer et exécuter le processus curl $ curl_handle = curl_init (); curl_setopt ($ curl_handle, CURLOPT_URL, 'http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); curl_setopt ($ curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ curl_handle, CURLOPT_POST, 1); curl_setopt ($ curl_handle, CURLOPT_POSTFIELDS, array ('name' => $ new_name, 'email' => $ new_email)); // Facultatif, supprimez cette ligne si votre API est ouverte curl_setopt ($ curl_handle, CURLOPT_USERPWD, $ username. ':'. $ Password); $ buffer = curl_exec ($ curl_handle); curl_close ($ curl_handle); $ result = json_decode ($ buffer); if (isset ($ result-> status) && $ result-> status == 'success') echo 'L'utilisateur a été mis à jour.';  else echo 'Quelque chose ne va pas'; 

Interagir avec votre API de cette manière fonctionne bien, mais cette méthode pose deux problèmes:

  1. Il utilise une syntaxe laide et déroutante - imaginez créer plusieurs applications basées sur cette.
  2. cURL n'est pas installé sur tous les serveurs par défaut.

Pour résoudre cette syntaxe moche, une bibliothèque cURL a été développée pour CodeIgniter qui simplifie énormément les choses..

La même demande faite avec la bibliothèque cURL ressemblerait à ceci:

 function ci_curl ($ new_name, $ new_email) $ username = 'admin'; $ password = '1234'; $ this-> load-> library ('curl'); $ this-> curl-> create ('http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); // Facultatif, supprimez cette ligne si votre API est ouverte $ this-> curl-> http_login ($ username, $ password); $ this-> curl-> post (array ('name' => $ new_name, 'email' => $ new_email)); $ result = json_decode ($ this-> curl-> execute ()); if (isset ($ result-> status) && $ result-> status == 'success') echo 'L'utilisateur a été mis à jour.';  else echo 'Quelque chose ne va pas'; 

Beaucoup plus agréable à regarder non? Il existe une méthode encore plus simple de travailler avec REST dans vos applications CodeIgniter:.

Bibliothèque client REST

Une bibliothèque client REST a été développée qui se trouve au-dessus de cette bibliothèque cURL qui gère la conversion de format, les connexions HTTP et plusieurs autres aspects de votre API REST..

 function rest_client_example ($ id) $ this-> load-> library ('rest', array ('server' => 'http: //localhost/restserver/index.php/example_api/', 'http_user' => ' admin ',' http_pass '=>' 1234 ',' http_auth '=>' basic '// ou' digest ')); $ user = $ this-> rest-> get ('utilisateur', array ('id' => $ id), 'json'); echo $ utilisateur-> nom; 

Ici, vous pouvez voir que nous faisons une requête GET, envoyant id en tant que paramètre et indiquant à la bibliothèque que nous voulons "json" comme format de contenu. Cela gère le paramétrage de Content-type pour vous et convertit les données en un objet PHP pour vous. Vous pouvez modifier cette valeur en "xml", "json", "sérialiser", "php", "csv" ou tout autre type MIME personnalisé de votre choix, par exemple:

 $ user = $ this-> rest-> get ('utilisateur', array ('id' => $ id), 'application / json');

Comme vous l'avez probablement deviné ainsi que $ this-> rest-> get (), la bibliothèque prend également en charge $ this-> rest-> post (), $ this-> rest-> put (), $ this-> rest -> delete () pour correspondre à toutes vos méthodes REST_Controller.

Vous aurez besoin des résultats de var_dump () provenant de la bibliothèque cliente REST pour vous assurer de récupérer le bon format de données. La conversion sera parfois un tableau et parfois un objet, selon la façon dont il est converti par PHP. Si le type MIME renvoyé n'est pas pris en charge, il renvoie simplement le format au format texte brut..

Parler à Twitter

En utilisant cette bibliothèque REST, vous pouvez parler à d'autres services RESTful tels que Twitter et Facebook. Voici un exemple simple de la façon dont vous pouvez obtenir des détails pour un utilisateur spécifique en fonction de son ID, en utilisant le format XML par défaut de Twitter..

 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/')); $ user = $ this-> rest-> get ('utilisateurs / show', array ('nom_écran' => 'philsturgeon'));
 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/', 'http_user' => 'nom d'utilisateur', 'http_pass' => 'mot de passe', ' http_auth '=>' basic ')); $ user = $ this-> rest-> post ('statuses / update.json', array ('status' => 'Utiliser le client REST pour faire des choses'));

En regardant cela, vous remarquerez que l’interaction avec l’API de Twitter est un peu différente de plusieurs manières..

  1. Ils supportent le changement de format basé sur les URL sous la forme de .json au lieu de / format / json. Certains nécessitent une extension, d'autres pas; il est donc préférable de toujours les ajouter.
  2. Ils ne prennent généralement en charge que GET / POST, mais commencent à ajouter de nouvelles méthodes DELETE.
  3. Ils n'ont pas toujours une ressource dans leur URL, par exemple: utilisateurs / recherche est une méthode REST, mais des listes est un autre.

Gardez un œil sur ces différences, car elles peuvent vous surprendre. Si vous êtes bloqué, echo simplement $ this-> rest-> debug () pour toute une gamme d'informations sur votre requête REST.

Résumé

En combinant vos connaissances actuelles sur les services RESTful, la bibliothèque client CodeIgniter REST et la documentation de l'API Twitter - ou toute autre documentation relative à l'API RESTful, vous pouvez créer des applications très puissantes qui s'intègrent à tout service Web personnalisé ou public à l'aide de REST. Vous pouvez étendre votre API en créant davantage de REST_Controller et même en créer une en utilisant Matchbox ou Modular Separation pour créer un contrôleur api.php pour chaque module afin de vous aider à garder votre API aussi bien organisée que votre application..

Suivez-nous sur Twitter ou abonnez-vous au fil RSS Nettuts + pour obtenir les meilleurs tutoriels de développement Web sur le Web. Et n'oubliez pas de consulter les scripts et les applications utiles de CodeIgniter sur Envato Market..