226 lines
6.4 KiB
PHP
226 lines
6.4 KiB
PHP
|
<?php namespace test\client;
|
||
|
|
||
|
use \manager\ManagerError;
|
||
|
|
||
|
/* CLASSE PERMETANT L'UTILISATION DU manifest.json POUR UTILISER DES APIS DIVERSES
|
||
|
*
|
||
|
* @return nomRetour<typeRetour> Description du retour
|
||
|
*
|
||
|
*/
|
||
|
class api{
|
||
|
|
||
|
// Fichier de configuration par defaut
|
||
|
private $config_path = '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<String> 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<String> Nom de la requete en question
|
||
|
* @parameters<Array> Liste des parametres de la requete
|
||
|
*
|
||
|
* @return response<Array> 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<String> Nom de la requete
|
||
|
* @parameters<Array> Liste des parametres de la requete
|
||
|
*
|
||
|
* @return filledRequest<Array> 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<String> Chaine a etudier et dans laquelle remplacer les parametres
|
||
|
* @parameters<Array> Liste des parametres a remplacer (prefixes d'un '@')
|
||
|
*
|
||
|
* @return after<String> 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;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
?>
|