453,34 → 453,19 |
*/ |
public function executer() { |
$retour = ''; |
switch ($this->methode) { |
case 'GET': |
$retour = $this->get(); |
break; |
case 'POST': |
$retour = $this->post();// Retour pour l'alternative PUT |
break; |
case 'DELETE': |
$retour = $this->delete(); |
break; |
case 'PUT': |
$retour = $this->put(); |
break; |
// Autorise l'accès depuis des serveurs tiers |
case 'OPTIONS': |
/*header('Access-Control-Allow-Origin: *'); |
header('Access-Control-Allow-Headers:origin, content-type'); |
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); |
header('Access-Control-Allow-Content-Type: application/json'); |
header('Access-Control-Max-Age: 3628800'); |
header('Access-Control-Allow-Credentials: false');*/ |
break; |
default : |
self::envoyerEnteteStatutHttp(self::HTTP_CODE_METHODE_NON_AUTORISE); |
try { |
$methode = 'executer'.ucwords($this->methode); |
if (method_exists($this, $methode)) { |
$retour = $this->$methode(); |
} else { |
header('Allow: GET, POST, DELETE, PUT'); |
$e = "La méthode HTTP '{$this->methode}' n'est pas prise en compte par ce serveur REST.\n". |
$msg = "La méthode HTTP '{$this->methode}' n'est pas prise en compte par ce serveur REST.\n". |
"Consulter l'entête Allow pour connaître les méthodes autorisées."; |
self::ajouterMessage($e); |
throw new Exception($msg, self::HTTP_CODE_METHODE_NON_AUTORISE); |
} |
} catch (Exception $e) { |
$this->envoyerEnteteStatutHttp($e->getCode()); |
$retour = $e->getMessage(); |
} |
$this->cloreAccesServeur($retour); |
} |
490,7 → 475,7 |
* when a resource name is given, or a resource element when a resource and resource unique identifier are given. It does not change the |
* database contents. |
*/ |
private function get() { |
private function executerGet() { |
$retour = ''; |
if ($this->service != null) { |
$Service = new $this->service(self::$config); |
499,112 → 484,118 |
$parametres = $Service->utiliserParametresBruts() ? $this->parametresBruts : $this->parametres; |
$retour = $Service->$methodeGet($this->ressources, $parametres); |
} else { |
self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_GET."' nécessaire ". |
"lors de l'appel du service via la méthode HTTP GET."; |
self::ajouterMessage($e); |
throw new Exception($e, self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
} |
} |
return $retour; |
} |
|
private function post() { |
private function executerPost() { |
$retour = ''; |
$paires = $this->parserDonneesRequete(); |
if (count($paires) != 0) { |
if (isset($paires['action']) && $paires['action'] == 'DELETE') {// Alternative à l'utilisation de DELETE |
$retour = $this->delete(); |
} else if (count($this->ressources) == 0) {// Alternative à l'utilisation de PUT |
$retour = $this->put(); |
} else { |
if ($this->service != null) { |
$Service = new $this->service(self::$config); |
if (method_exists($Service, self::METHODE_POST)) { |
$methodePost = self::METHODE_POST; |
$info = $Service->$methodePost($this->ressources, $paires); |
if ($info !== false) { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CREATION_OK); |
$retour = $info; |
} |
} else { |
self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_POST."' nécessaire ". |
"lors de l'appel du service via la méthode HTTP GET."; |
self::ajouterMessage($e); |
} |
} |
} |
} else { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CONTENU_REQUIS); |
if (count($paires) == 0) { |
$e = "Le service '{$this->service}' requiert de fournir le contenu à modifier dans le corps ". |
"de la requête avec la méthode HTTP POST."; |
self::ajouterMessage($e); |
throw new Exception($e, self::HTTP_CODE_CONTENU_REQUIS); |
} |
return $retour; |
} |
|
private function put() { |
$retour = ''; |
$paires = $this->parserDonneesRequete(); |
if (count($paires) != 0) { |
if (isset($paires['action']) && $paires['action'] == 'DELETE') {// Alternative à l'utilisation de DELETE |
$retour = $this->delete(); |
} else if (count($this->ressources) == 0) {// Alternative à l'utilisation de PUT |
$retour = $this->put(); |
} else { |
if ($this->service != null) { |
$Service = new $this->service(self::$config); |
if (method_exists($Service, self::METHODE_PUT)) { |
$methodePut = self::METHODE_PUT; |
$info = $Service->$methodePut($this->ressources, $paires); |
if ($info !== false) { |
if (method_exists($Service, self::METHODE_POST) === false) { |
$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_POST."' nécessaire ". |
"lors de l'appel du service via la méthode HTTP GET."; |
throw new Exception($e, self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
} |
|
$methodePost = self::METHODE_POST; |
$info = $Service->$methodePost($this->ressources, $paires); |
if ($info !== false) { |
// TODO : supprimer ce test quand tous les ws utiliserons les exceptions |
if (function_exists('http_response_code') && http_response_code() == 200) { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CREATION_OK); |
$retour = $info; |
} |
} else { |
self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_PUT."' nécessaire ". |
"lors de l'appel du service via la méthode HTTP GET."; |
self::ajouterMessage($e); |
$retour = $info; |
} |
} |
} else { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CONTENU_REQUIS); |
$e = "Il est nécessaire de fournir du contenu dans le corps de la requête pour créer une nouvelle ressource."; |
self::ajouterMessage($e); |
} |
return $retour; |
} |
|
private function delete() { |
private function executerPut() { |
$paires = $this->parserDonneesRequete(); |
if (count($paires) == 0) { |
$e = "Il est nécessaire de fournir du contenu dans le corps de la requête pour créer une nouvelle ressource."; |
throw new Exception($e, self::HTTP_CODE_CONTENU_REQUIS); |
} |
|
$retour = ''; |
if (count($this->ressources) != 0) { |
$paires = $this->parserDonneesRequete(); |
if ($this->service != null) { |
$Service = new $this->service(self::$config); |
if (method_exists($Service, self::METHODE_DELETE)) { |
$methodeDelete = self::METHODE_DELETE; |
$info = $Service->$methodeDelete($this->ressources, $paires); |
if ($info === true) { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_SUPPRESSION_OK); |
} else if ($info === false) { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
$e = "La ressource à supprimer est introuvable. Il se peut qu'elle ait été préalablement supprimé."; |
self::ajouterMessage($e); |
} else { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_OK); |
$retour = $info; |
} |
} else { |
self::envoyerEnteteStatutHttp(self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_DELETE."' nécessaire ". |
"lors de l'appel du service via la méthode HTTP GET."; |
self::ajouterMessage($e); |
if ($this->service != null) { |
$Service = new $this->service(self::$config); |
if (method_exists($Service, self::METHODE_PUT) === false) { |
$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_PUT."' nécessaire ". |
"lors de l'appel du service via la méthode HTTP GET."; |
throw new Exception($e, self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
} |
|
$methodePut = self::METHODE_PUT; |
$info = $Service->$methodePut($this->ressources, $paires); |
if ($info !== false) { |
// TODO : supprimer ce test quand tous les ws utiliserons les exceptions |
if (function_exists('http_response_code') && http_response_code() == 200) { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_CREATION_OK); |
} |
$retour = $info; |
} |
} else { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_MAUVAISE_REQUETE); |
} |
return $retour; |
} |
|
private function executerDelete() { |
if (count($this->ressources) == 0) { |
$e = "Il est nécessaire d'indiquer dans l'url la ressource à supprimer."; |
self::ajouterMessage($e); |
throw new Exception($e, self::HTTP_CODE_MAUVAISE_REQUETE); |
} |
|
$paires = $this->parserDonneesRequete(); |
$retour = ''; |
if ($this->service != null) { |
$Service = new $this->service(self::$config); |
if (method_exists($Service, self::METHODE_DELETE) === false) { |
$e = "Le service '{$this->service}' ne contient pas la méthode '".self::METHODE_DELETE."' nécessaire ". |
"lors de l'appel du service via la méthode HTTP GET."; |
throw new Exception($e, self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
} |
|
$methodeDelete = self::METHODE_DELETE; |
$info = $Service->$methodeDelete($this->ressources, $paires); |
if ($info === true) { |
$this->envoyerEnteteStatutHttp(self::HTTP_CODE_SUPPRESSION_OK); |
} else if ($info === false) { |
$e = "La ressource à supprimer est introuvable. Il se peut qu'elle ait été préalablement supprimé."; |
throw new Exception($e, self::HTTP_CODE_RESSOURCE_INTROUVABLE); |
} else { |
$retour = $info; |
} |
} |
return $retour; |
} |
|
/*private function executerOptions() { |
header('Access-Control-Allow-Origin: *'); |
header('Access-Control-Allow-Headers:origin, content-type'); |
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); |
header('Access-Control-Allow-Content-Type: application/json'); |
header('Access-Control-Max-Age: 3628800'); |
header('Access-Control-Allow-Credentials: false'); |
}*/ |
|
/** |
* Parse les données contenu dans le corps de la requête HTTP (= POST) en : |
* - décodant les clés et valeurs. |