NxTIC/api/client.php

146 lines
4.4 KiB
PHP

<?php
namespace api;
use \manager\ResourceDispatcher;
use \manager\ManagerError;
/* CLASSE PERMETANT L'UTILISATION DU manifest.json POUR UTILISER DES APIS DIVERSES
*
* @return nomRetour<typeRetour> Description du retour
*
*/
class client{
// Fichier de configuration par defaut
private $config_path = 'f/json/manifest/api';
public $error;
/*************/
/* 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( ResourceDispatcher::getResource($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'];
}
/* CONSTRUCTION D'UNE REQUETE
*
* @request_name<String> Nom de la requete
* @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()){
/* [0] Gestion des INPUTS
=========================================================*/
// On retourne une erreur si la requete n'existe pas
if( !isset($this->requests[$request_name]) ) return false;
/* [1] Remplacement des parametres (valeurs globales)
=========================================================*/
/* (1) On enregistre une copie de la requete */
$request = $this->requests[$request_name];
/* (2) Remplacement dans l'URL */
$request['url'] = $this->fillParameters($request['url'], $parameters);
/* (3) Remplacement dans les headers */
foreach($request['headers'] as $name=>$value)
$request['headers'][$name] = $this->fillParameters($value, $parameters);
/* (3) Remplacement dans les postdata */
foreach($request['postdata'] as $name=>$value)
$request['postdata'][$name] = $this->fillParameters($value, $parameters);
/* [2] On remplace dans les valeurs d'I/O
=========================================================*/
/* (1) Remplacement dans les INPUT */
foreach($request['input'] as $i=>$input)
foreach($input as $name=>$value)
$request['input'][$i][$name] = $this->fillParameters($value, $parameters);
/* (2) Remplacement dans les OUTPUT */
foreach($request['output'] as $i=>$output)
foreach($output as $name=>$value)
$request['output'][$i][$name] = $this->fillParameters($value, $parameters);
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;
}
}
?>