Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Utiliser REST en PHP

Article posté le 05-02-2014 dans la catégorie PHP

Info : cet article contient deux parties : la première contient un peu de théorie, la deuxième, une classe prête à l'emploi pour vous faire gagner du temps!

1- Un peu de théorie

REST : Representational State Transfer. Il s'agit d'un style d'architecture qui repose grandement sur le protocole HTTP, sans rajouter de surcouche à l'instar de SOAP.

Basé sur le principe CRUD (Create, Read, Update, Delete), il existe quatre types de méthodes :

REST permet de consulter, créer, modifier ou supprimer des données de manière simple, et ce sans imposer le format des données retournées. Dans certains cas de paramétrages, il permet même de choisir : XML, JSON, PHP sérializé...

On dit qu'une application est Restfull quand elle utilise le principe des commandes dans l'URL, par exemple :

http://monsite.com/serveur-rest/?methode=editer_fichesfilm&id=12

Il faut cependant être très vigilant et ne pas passer de données critiques en tant que paramètres dans l'URL. D'ailleurs en parlant de ça, il faut parfois utiliser la fonction url_encode() pour certaines requêtes aux caractères spéciaux.

Les requêtes de type GET

Pour cette requête basique, on utilsier la fonction file_get_contents, par exemple :

$film = file_get_contents('http://mediathèque/film/11');

Les autres requêtes :

Ici nous utiliserons des flux, et pour cela, trois fonctions :

Il faudra ensuite, en plus de lire les données, mais aussi gérer les codes retours du serveur (entêtes, erreurs éventuelles) :

2- Une classe complète et explication comment l'utiliser

Voici une classe complète utilisable comme client REST :

class clientRest {
            private $_urlDuSite;
            public function definirUrl($votreUrl) {
                $this->_urlDuSite = $votreUrl;
                return $this;
            }
            public function getRequest($vosParametres = array()) {
                return $this->_Creation($this->_creationURL($vosParametres), $this->_CreationContexte('GET'));
            }
            public function postRequest($parametresPost = array(), $parametresGet = array()) {
                return $this->_Creation($this->_creationURL($parametresGet), $this->_CreationContexte('POST', $parametresPost));
            }
            public function putRequest($leContenu = null, $parametresGet = array()) {
                return $this->_Creation($this->_creationURL($parametresGet), $this->_CreationContexte('PUT', $leContenu));
            }
            public function deleteRequest($leContenu = null, $parametresGet = array()) {
                return $this->_Creation($this->_creationURL($parametresGet), $this->_CreationContexte('DELETE', $leContenu));
            }
            protected function _CreationContexte($laMethode, $leContenu = null) {
                $options = array(
                    'http' => array(
                        'method' => $laMethode,
                        'header' => 'Content-type: application/x-www-form-urlencoded',
                    )
                );
                if ($leContenu !== null) {
                    if (is_array($leContenu)) {
                        $leContenu = http_build_query($leContenu);
                    }
                    $options['http']['content'] = $leContenu;
                }
                return stream_context_create($options);
            }
            protected function _creationURL($pParams) {
                return $this->_urlDuSite
                        . (strpos($this->_urlDuSite, '?') ? '' : '?')
                        . http_build_query($pParams);
            }
            protected function _Creation($votreURL, $leContexte) {
                if (($stream = fopen($votreURL, 'r', false, $leContexte)) !== false) {
                    $content = stream_get_contents($stream);
                    $header = stream_get_meta_data($stream);
                    fclose($stream);
                    return array('content' => $content, 'header' => $header);
                } else {
                    return false;
                }
            }
        }

Maintenant l'utilisation, imaginons par exemple votre serveur attende que votre chaine jSON soit contenue dans la variable $_POST['tarif'].

Créons un tableau associatif :

Pour rappel, voir ici comment contruire une chaine jSON avec PHP.

//$dataJson contient votre chaine jSon (votre demande) encodée via json_endode() et $varURL contient l'URL du serveur
//Pour RAPPEL : En PHP, chaque sous ensemble de votre demande json doit être un array() ! Vérifiez bien avant d'encoder ! (ou voir tuto mentionné juste avant dans le lien)
$dataJson = array('tarif' => $dataJson);

Maintenant, réalisons notre requête, de type POST donc :

$dataJson = array('tarif' => $dataJson);
 $rest = new clientRest();
 $mesData = $rest->definirUrl($varURL)->postRequest($dataJson)['content'];

Une requête POST retourne un tableau associatif, le premier élément est header, le second content. C'est ce dernier qui nous intéresse, donc que l'on lit.

Maintenant, supprimons les espaces parasites éventuels, puis décodons notre réponse :

$mesData = preg_replace('/[x00-x1Fx80-xFF]/', '', $mesData);
$mesData = json_decode($mesData);

$mesData contient à présent un objet que vous pouvez lire de cette façon :

echo $mesData->tarif->assurance;

A noter que la fonction json_decode accepte un second paramètre optionnel : true. Dans ce cas, au lieu de vous créer un objet, elle créera un tableau associatif.

 


Tweet
comments powered by Disqus