1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 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:
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:
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:
96: $this->reponse_entetes = stream_get_meta_data($flux);
97:
98:
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: }