Ce tutoriel utilise le programme open source Restler 3.0 de Luracast pour créer une API REST.
Détail de l'installation de Restler sur Debian GNU/Linux 9 (stretch) 64 bits équipé d'un serveur LAMP ici.
Commençons par quelque chose de simple : nous allons créer une classe Dis.php qui quand elle sera appelé renverra bonjour suivi du paramètre passer à l'URL.
class Dis { function bonjour($par='le monde') { return "Bonjour $par!"; } }
Maintenant, nous sommes prêt à construire l'index pour le script de notre API. Commençons par télécharger le code Restler et à indiquer qu'il est requis dans notre page d'index.
require_once '../vendor/restler.php'; use Luracast\Restler\Restler; use Luracast\Restler\Defaults; Defaults::$smartAutoRouting = false;
La prochaine étape est d'initialiser l'objet Restler et de spécifier que la classe que nous utilisons est exposée à la plateforme Restler par la méthode GET
$r = new Restler(); $r->addAPIClass('Dis'); $r->handle();
C'est fait la plateforme est prête à prendre en compte les requêtes de type REST en utilisant l'URL suivante :
index.php/Dis/bonjour/Aurélien Martineau
C'est fait, nous avons réussit à créer une classe et à l'exposer à la méthode de l'URL pour que celle-ci renvoie des informations à l'utilisateur.
Passons maintenant à quelque chose d'utile et plus structuré :
Pour notre exemple, nous allons maintenant créer une API qui est capable de lire et manipuler des données. Nous allons d'abord commencer par créer une simple base de données qui contient une table nommée individu avec le champ id, prenom, nom et email.
Nous allons pouvoir alors rechercher des individus, en ajouter, faire des modification et enfin des suppressions.
Voici la classe en question :
use Luracast\Restler\RestException; class Individu { static $FIELDS = array('prenom','nom', 'email'); protected $db; function __construct(){ $this->db = newMysqlDb('host', 'username', 'password', 'database'); } function get($id=NULL) { if($id != NULL){ $this->db->where('person_id', $id); } $results = $this->db->get('person'); return $results; } }
Il suffit d'exposer maintenant notre classe à la plateforme Restler comme nous l'avions fait précédemment pour la classe dis bonjour le monde.
require_once '../vendor/restler.php'; use Luracast\Restler\Defaults; Defaults::$smartAutoRouting = false; $r = new Restler(); $r->addAPIClass(Individu); $r->handle();
Si vous visitez l'url localhost/index.php/individu/1
, Restler utilisera la méthode GET car c'est celle préconisée en Restfull et vous retournera l'enregistrement 1 correspondant à votre base de données. Si vous ne spécifiez d'ID pour un individu tous les enregistrements vous seront retournés par défaut.
Comme dans tout système digne de ce nom, la gestion des erreurs est primordiale en Restfull surtout si votre système est intégré à un autre système.
Restler permet de définir un code d'erreur et un message de sortie à l'utilisateur.
Les codes d'erreur reflète l'état de la requête HTTP envoyé à savoir :
soit en français
function get($id = NULL) { if($id != NULL){ $this->db->where('person_id', $id); } $results = $this->db->get('person'); if(empty($results) && $id != NULL){ $langage = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2)); switch($langage) { case "fr" : $message="Cet ID n'existe pas"; break; case "de" : $message="Diese ID existiert nicht"; break; case "es" : $message="Este ID no existe"; break; case "it" : $message="Questo ID non esiste"; break; default : $message="This ID doesn't exist"; } throw new RestException(400, $message); } return $results; }
Maintenant, si vous visitez la page localhost/index.php/individu/10
, vous aurez le message d'erreur 400 avec le message Cet ID n'existe pas
.
Restler permet d'afficher les erreurs à l'utilisateur si vous le souhaitez. Si c'est le cas, le script n'exécutera alors aucune autre action.
Vous avez remarqué que par défaut Restler renvoie des données en JSON, c'est la configuration par défaut. Maintenant vous pouvez lui spécifier un autre langage par exemple le xml en plus du JSON.
$r->setSupportedFormats('JsonFormat','XmlFormat');
Ainsi par défaut, il retournera du json, mais il pourra également accepté du XML si vous faites la requête suivante : localhost/index.php/person.xml/1
.
Voici la source anglophone d'où provient cet article écrit par Richard Askew : https://hungrydevelopers.blogspot.com/2013/08/create-your-own-api-with-restler.html