Mise en place d'une API REST en PHP

Services REST

Bien que les services REST soient très courants, j'ai étonnamment croisé peu de documentation française sur la réalisation d'une API REST. D'où cet article inspiré de cet autre article « Create a RESTFUL SERVICES API » de Srinivas Tamada.
Un service REST permet de mettre à disposition d'autres applications des ressources et non des fonctionnalités. Sa mise en place et son utilisation est donc beaucoup plus simple que SOAP. REST est donc fortement recommandé pour des cas simples où on cherche à effectuer des actions simples sur un contenu, comme tester l'existence d'un élément dans la base de données d'une application, ou le modifier.

Cas d'utilisation :

Les applications 1,2 et 3 peuvent être des applications Web, smartphone, etc. Elles peuvent être écrites en différents langages. Elles doivent juste pouvoir utiliser le protocole http.
En effet une architecture REST repose sur le protocole http, comme expliqué par Gérald Croes dans son blog : On accède à une ressource (par son URI unique) pour procéder à diverses opérations supportées nativement par HTTP.

On peut demander à :

  • Lire une ressource (GET)
  • Modifier une ressource(PUT)
  • Ecrire une ressource(POST)
  • Supprimer une ressource (DELETE)

 

Mise en place

Dans mon cas j'ai utilisé la libraire REST suivante : Rest.php

Il ne reste alors qu'à créer notre classe qui hérite de cette classe REST.
On définit dans cette classe:

  • le format d'entrée (fonction processAPI)
  • le format de sortie (fonction encodejson)
  • ainsi que toutes les actions possibles sur les ressources.

 

Format d'entrée

Je veux que seules les URLs de la forme request/action_possible  puissent accéder au service REST, les autres URLs seront reroutées vers une page 404.

/**
* Public method for access api.
* This method dynmically call the method based on the query string
* */
public function processApi($func){
   $func = strtolower(trim(str_replace("/","",$_REQUEST['rquest'])));
   if((int)method_exists($this,$func) > 0) $this->$func();
   else $this->response('',404); // si la fonction n’existe pas, la réponse sera "Page not found".
}

Format de sortie

Toutes les données sont encodées en json, format « polyglotte » exploitable par tous.

/**
* Encode array into JSON
*/
private function json($data){
   if(is_array($data)){
     return json_encode($data);
   }
}

 

Actions possibles sur les ressources

Vérification de l’existence d’une ressource :

Vérifie que la ressource recherchée existe, si oui, renvoi des informations sur la ressource, sinon renvoi de 204 « Content not found ».

/**
* Vérification existence preco
* numanc : $numanc
*/
private function res_exist(){
   if($this->get_request_method() != "GET"){ $this->response('',406); }
   $my_preco=new Model_Precos;
   $numanc=$this->_request['numanc'];
   $res=$my_preco->fetchRow("numanc='$numanc'");
   if(is_object($res)){
       $this->response($this->json($res->toArray()), 200);
   }else{
      $this->response('',204);
   }
}

 

Suppression d’une ressource

/**
* Suppression preco
* numanc : $numanc
*/
private function suppr_res(){
    if($this->get_request_method() != "DELETE"){ $this->response('',406); }
   $my_preco=new Model_Precos;
   $numanc=$this->_request['numanc'];
   $ret=$my_preco->delete($numanc);
   If($ret){
       $success = array('status' => "Success", "msg" => "Element supprimé.");
       $this->response($this->json($success),200);
   }else{
       $this->response('',204);
   }
}

 

On note que pour chaque fonctionnalité il est systématiquement vérifié que la bonne méthode de l’entête est appelée.(DELETE, GET)… De même chaque variable est nettoyée et vérifiée avant d’être utilisée grâce à la fonction cleanInputs de la classe Rest.

On obtient donc la classe suivante: Rest_api.php

Pour tester votre API websrevice vous pouvez utiliser POSTMAN sur Chrome. Pour en savoir plus sur le fonctionnement du protocole http, vous pouvez consulter cet article de Julien PAULI : http://julien-pauli.developpez.com/tutoriels/web/http/

En espérant que cet article soit utile à certains !

 

Commentaires 7

Guest - Claude

le mardi 21 mai 2013 00:07

un exemple concret, serait-ce possible ?
Par exemple vérifier l'existence d'un pseudo dans une table...
Je découvre par hasard les Services REST, et ce billet n'explique pas clairement comment utiliser ces deux api...

Merci
Claude

un exemple concret, serait-ce possible ? Par exemple vérifier l'existence d'un pseudo dans une table... Je découvre par hasard les Services REST, et ce billet n'explique pas clairement comment utiliser ces deux api... Merci Claude

Guest - MED

le mardi 18 juin 2013 16:14

bonjour, un exemple d'appel d'une méthode(service) s'il vous plait

bonjour, un exemple d'appel d'une méthode(service) s'il vous plait

Guest - isaac

(website) le samedi 3 août 2013 11:41

Nice one, this is what i wanted

Nice one, this is what i wanted

Super User

(website) le lundi 12 août 2013 13:49

cool, happy it can help!

cool, happy it can help! :)

Guest - toto

le lundi 2 septembre 2013 13:58

c'est bien
mais ça ne permet pas du tout de voir comment à partir d'une requête Rest du type
http://xx/api.php/getusers, on arrive à nos fins

dommage

c'est bien mais ça ne permet pas du tout de voir comment à partir d'une requête Rest du type http://xx/api.php/getusers, on arrive à nos fins dommage

Super User

(website) le mardi 3 septembre 2013 06:51

Bonjour,

pour arriver à tes fins tu dois modifier la fonction :

public function processApi($func) de manière à ne pas exiger $_REQUEST['rquest'] mais api.php dans ton URL.

hope it helps...

Raphaelle

Bonjour, pour arriver à tes fins tu dois modifier la fonction : public function processApi($func) de manière à ne pas exiger $_REQUEST['rquest'] mais api.php dans ton URL. hope it helps... Raphaelle

Guest - Anthony Destenay

(website) le mardi 4 février 2014 19:47

Retrouvez un tuto complet (en anglais) sur le site de l'auteur de la librairie :-)
Je suis en train de le parcourir...

http://www.9lessons.info/2012/05/create-restful-services-api-in-php.html

Retrouvez un tuto complet (en anglais) sur le site de l'auteur de la librairie :-) Je suis en train de le parcourir... http://www.9lessons.info/2012/05/create-restful-services-api-in-php.html
Pas encore de commentaire
Already Registered? Login Here
Guest
dimanche 27 septembre 2020

Image Captcha

By accepting you will be accessing a service provided by a third-party external to https://www.pulsar-informatique.com/