Overview

Packages

  • Framework
  • None
  • PHP
  • Utilitaire

Classes

  • Bdd
  • Cache
  • CacheSimple
  • Chronometre
  • Cli
  • Config
  • Controleur
  • Debug
  • Framework
  • GestionnaireException
  • I18n
  • Log
  • Registre
  • RestClient
  • RestServeur
  • RestService
  • Script
  • SquelettePhp
  • Url
  • Overview
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: // declare(encoding='UTF-8');
  3: /**
  4: * Classe client permettant d'interroger des services web REST.
  5: *
  6: * @category php 5.2
  7: * @package  Framework
  8: * @author       Jean-Pascal MILCENT <jpm@tela-botanica.org>
  9: * @copyright    Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
 10: * @license      http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
 11: * @license      http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
 12: * @version      $Id: RestClient.php 353 2011-08-01 16:02:32Z jpm $
 13: */
 14: class RestClient {
 15:     const HTTP_URL_REQUETE_SEPARATEUR = '&';
 16:     const HTTP_URL_REQUETE_CLE_VALEUR_SEPARATEUR = '=';
 17:     private $http_methodes = array('GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS', 'CONNECT', 'TRACE');
 18:     protected $parametres = null;
 19:     private $url = null;
 20:     private $reponse_entetes = null;
 21: 
 22:     //+----------------------------------------------------------------------------------------------------------------+
 23:     // ACCESSEURS
 24: 
 25:     public function getReponseEntetes() {
 26:         return $this->reponse_entetes;
 27:     }
 28: 
 29:     public function getParametre($cle) {
 30:         $valeur = (isset($this->parametres[$cle])) ? $this->parametres[$cle] : null;
 31:         return $valeur;
 32:     }
 33: 
 34:     public function ajouterParametre($cle, $valeur) {
 35:         $this->parametres[$cle] = $valeur;
 36:     }
 37: 
 38:     public function supprimerParametre($cle) {
 39:         unset($this->parametres[$cle]);
 40:     }
 41: 
 42:     public function nettoyerParametres() {
 43:         $this->parametres = null;
 44:     }
 45: 
 46:     //+----------------------------------------------------------------------------------------------------------------+
 47:     // MÉTHODES
 48: 
 49:     public function consulter($url) {
 50:         $retour = $this->envoyerRequete($url, 'GET');
 51:         return $retour;
 52:     }
 53: 
 54:     public function ajouter($url, Array $donnees) {
 55:         $retour = $this->envoyerRequete($url, 'PUT', $donnees);
 56:         return $retour;
 57:     }
 58: 
 59:     public function modifier($url, Array $donnees) {
 60:         $retour = $this->envoyerRequete($url, 'POST', $donnees);
 61:         return $retour;
 62:     }
 63: 
 64:     public function supprimer($url) {
 65:         $retour = $this->envoyerRequete($url, 'DELETE');
 66:         return $retour;
 67:     }
 68: 
 69:     public function envoyerRequete($url, $mode, Array $donnees = array()) {
 70:         $this->url = $url;
 71:         $contenu = false;
 72:         if (! in_array($mode, $this->http_methodes)) {
 73:             $e = "Le mode de requête '$mode' n'est pas accepté!";
 74:             trigger_error($e, E_USER_WARNING);
 75:         } else {
 76:             if ($mode == 'GET') {
 77:                 $this->traiterUrlParametres();
 78:             }
 79:             $content = http_build_query($donnees, null, self::HTTP_URL_REQUETE_SEPARATEUR);
 80:             $contexte = stream_context_create(array(
 81:                 'http' => array(
 82:                     'method' => $mode,
 83:                     'header' => "Content-type: application/x-www-form-urlencoded\r\n",
 84:                     'content' => $content)));
 85:             $flux = @fopen($this->url, 'r', false, $contexte);
 86:             if (!$flux) {
 87:                 $this->reponse_entetes = $http_response_header;
 88:                 $entetesFmt = print_r($this->analyserEntete(), true);
 89:                 $e = "L'ouverture de l'url '{$this->url}' par la méthode HTTP '$mode' a échoué!\n".
 90:                     "Le contenu des métadonnées était : $entetesFmt \n".
 91:                     "Les paramètres de la requête HTTP étaient : $content \n".
 92:                     "Le contenu était : ".stream_get_contents($flux);
 93:                 trigger_error($e, E_USER_WARNING);
 94:             } else {
 95:                 // Informations sur les en-têtes et métadonnées du flux
 96:                 $this->reponse_entetes = stream_get_meta_data($flux);
 97: 
 98:                 // Contenu actuel de $url
 99:                 $contenu = stream_get_contents($flux);
100: 
101:                 fclose($flux);
102:             }
103:             $this->traiterEntete();
104:         }
105:         $this->reinitialiser();
106:         return $contenu;
107:     }
108: 
109:     private function traiterUrlParametres() {
110:         $parametres = array();
111:         if (count($this->parametres) > 0) {
112:             foreach ($this->parametres as $cle => $valeur) {
113:                 $cle = rawurlencode($cle);
114:                 $valeur = rawurlencode($valeur);
115:                 $parametres[] = $cle.self::HTTP_URL_REQUETE_CLE_VALEUR_SEPARATEUR.$valeur;
116:             }
117:             $url_parametres = implode(self::HTTP_URL_REQUETE_SEPARATEUR, $parametres);
118:             $this->url = $this->url.'?'.$url_parametres;
119:         }
120:     }
121: 
122:     private function traiterEntete() {
123:         $infos = $this->analyserEntete();
124:         $this->traiterEnteteDebogage($infos);
125:     }
126: 
127:     private function analyserEntete() {
128:         $entetes = $this->reponse_entetes;
129:         $infos = array('date' => null, 'uri' => $this->url, 'debogages' => null);
130: 
131:         if (isset($entetes['wrapper_data'])) {
132:             $entetes = $entetes['wrapper_data'];
133:         }
134:         foreach ($entetes as $entete) {
135:             if (preg_match('/^X_REST_DEBOGAGE_MESSAGES: (.+)$/', $entete, $match)) {
136:                 $infos['debogages'] = json_decode($match[1]);
137:             }
138:             if (preg_match('/^Date: .+ ([012][0-9]:[012345][0-9]:[012345][0-9]) .*$/', $entete, $match)) {
139:                 $infos['date'] = $match[1];
140:             }
141:         }
142:         return $infos;
143:     }
144: 
145:     private function traiterEnteteDebogage($entetes_analyses) {
146:         if (isset($entetes['debogages'])) {
147:             $date = $entetes['date'];
148:             $uri = $entetes['uri'];
149:             $debogages = $entetes['debogages'];
150:             foreach ($debogages as $debogage) {
151:                 $e = "DEBOGAGE : $date - $uri :\n$debogage";
152:                 trigger_error($e, E_USER_NOTICE);
153:             }
154:         }
155:     }
156: 
157:     private function reinitialiser() {
158:         $this->nettoyerParametres();
159:     }
160: }
TBFramework - v0.3 API documentation generated by ApiGen 2.8.0