Description du retour * */ class client{ // Fichier de configuration par defaut private $config_path = __ROOT__.'/api/manifest.json'; public $error; // liste des methodes public static $METHODS = array( 'POST' => array( CURLOPT_POST, true ), 'GET' => array( CURLOPT_HTTPGET, true ), 'PUT' => array( CURLOPT_CUSTOMREQUEST, 'PUT' ), 'DELETE' => array( CURLOPT_CUSTOMREQUEST, 'DELETE' ) ); /*************/ /* ATTRIBUTS */ /*************/ private $manifest = null; // Contiendra le tableau correspondant au JSON private $requests = array(); // Contiendra la liste des requetes de l'api et leurs parametres private $name; private $description; private $version; /* CONSTRUCTEUR DU CLIENT DE L'API * * @config Chemin du fichier de configuration de l'api * */ public function __construct($config=null){ /* [0] Gestion du fichier de config si donne en param =========================================================*/ if( $config !== null ) $this->config_path = $config; /* [1] On recupere le contenu du fichier de config =========================================================*/ $manifest = json_decode( file_get_contents($this->config_path), true ); // Si erreur de parsage ou de fichier, on retourne une erreur if( $manifest === null ){ $this->error = ManagerError::ParsingFailed; return; } /* [2] On repartie et classe les donnees =========================================================*/ /* (1) Informations generales */ $name = $manifest['name']; $description = $manifest['description']; $version = $manifest['version']; /* (2) Liste des requetes */ $this->requests = $manifest['requests']; } /* ENVOI ET CONSTRUCTION D'UNE REQUETE * * @request_name Nom de la requete en question * @parameters Liste des parametres de la requete * * @return response Reponse HTTP au format norme ou FAUX si une erreur occure * */ public function send($request_name, $parameters=array()){ /* [1] On construit la requete avec les parametres =========================================================*/ $build = $this->build($request_name, $parameters); // Si la construction a echoue, on retourne une erreur if( $build === false ) return false; /* [2] Header et pre-data de la requete =========================================================*/ /* (1) On definit l'URL */ $curl = curl_init($build['url']); // permet de recupere le resultat au lieu de l'afficher curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); /* (2) On definit la methode */ $method_arguments = self::$METHODS[ $build['method'] ]; curl_setopt($curl, $method_arguments[0], $method_arguments[1]); /* (3) On definit les headers */ $headers = array(); // On construit le header au bon format : 'name: value' foreach($build['headers'] as $name=>$value) array_push($headers, $name.': '.$value); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); /* (4) On definit les donnees POST si on est pas en get */ if( $build['method'] != 'GET' ){ $postdata = ''; // On formatte les donnees au format 'key=value&key=value' foreach($build['postdata'] as $key=>$value) $postdata .= $key.'='.$value.'&'; rtrim($postdata); // on supprime le '&' a la fin s'il y a // On envoie les donnees curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); } /* [4] Execution de la requete et recup de la response =========================================================*/ $response = curl_exec($curl); curl_close($curl); /* [5] On retourne la reponse =========================================================*/ return $response; } /* CONSTRUCTION D'UNE REQUETE * * @request_name Nom de la requete * @parameters Liste des parametres de la requete * * @return filledRequest Renvoie la requete avec les bons parametres * */ private function build($request_name, $parameters=array()){ /* [0] Gestion des INPUTS =========================================================*/ // On retourne une erreur si la requete n'existe pas if( !isset($this->requests[$request_name]) ) return false; // On enregistre une copie de la requete $request = $this->requests[$request_name]; /* [1] Gestion de la methode =========================================================*/ // Si la methode n'est pas prise en compte, on retourne une erreur if( !isset( self::$METHODS[$request['method']] ) ) return false; /* [2] Remplacement des parametres (valeurs globales) =========================================================*/ /* (1) Remplacement dans l'URL */ $request['url'] = $this->fillParameters($request['url'], $parameters); /* (2) Remplacement dans les headers */ foreach($request['headers'] as $name=>$value) $request['headers'][$name] = $this->fillParameters($value, $parameters); /* (2) Remplacement dans les postdata */ foreach($request['postdata'] as $name=>$value) $request['postdata'][$name] = $this->fillParameters($value, $parameters); /* [3] Retour de la requete construite =========================================================*/ return $request; } /* REMPLACE LES PARAMETRES DANS UNE CHAINE * * @before Chaine a etudier et dans laquelle remplacer les parametres * @parameters Liste des parametres a remplacer (prefixes d'un '@') * * @return after Chaine contenant les parametres de la liste @parameters * */ private function fillParameters($before, $parameters){ // On initialise la valeur de retour $after = $before; /* [1] On remplace les parametres prefixes par '@' =========================================================*/ foreach($parameters as $name=>$value){ $position = strpos($after, $name); // Si on a trouve, on remplace le nom de variable par la valeur if( $position !== false ) $after = substr($after, 0, $position) . $value . substr($after, $position+strlen($name) ); } /* [2] On retourne la nouvelle chaine =========================================================*/ return $after; } } ?>