Subversion Repositories Applications.framework

Compare Revisions

Ignore whitespace Rev 482 → Rev 483

/trunk/framework/RestServeur.php
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.