PHP RESTful
REST (en anglais : Representational State Transfer, abrégé en REST) désigne un ensemble de contraintes et de principes architecturaux.
Les API Web qui sont conformes au style de conception REST sont appelées API RESTful. Elles définissent les ressources selon les trois aspects suivants :
- Adresse de ressource intuitive et concise : URI, par exemple :
http://example.com/resources/。
- Ressource transférée : les types de médias Internet que le service web accepte et renvoie, tels que JSON, XML, YAM, etc.
- Opérations sur la ressource : un ensemble de méthodes de requête prises en charge par le service web sur cette ressource (par exemple, POST, GET, PUT ou DELETE).
Dans ce tutoriel, nous allons utiliser PHP (sans framework) pour créer un service web RESTful. À la fin de l'article, vous pouvez télécharger le code utilisé dans ce chapitre.
À travers ce tutoriel, vous apprendrez ce qui suit :
- Créer un service web RESTful.
- Utiliser PHP natif sans dépendre d'aucun framework.
- Les modèles d'URI doivent respecter les règles REST.
- Les formats qu'un service RESTful accepte et renvoie peuvent être JSON, XML, etc.
- Répondre avec les codes d'état HTTP correspondants selon les différentes situations.
- Démontrer l'utilisation des en-têtes de requête.
- Utiliser un client REST pour tester le service web RESTful.
Exemple de service web RESTful
Le code suivant est la classe de service RESTfulSite.php:
Exemple
<?php
Class Site {
private $sites = array(
1 => 'TaoBao',
2 => 'Google',
3 => 'Example',
4 => 'Baidu',
5 => 'Weibo',
6 => 'Sina'
);
public function getAllSite(){
return $this->sites;
}
public function getSite($id){
$site = array($id => ($this->sites[$id]) ? $this->sites[$id] : $this->sites[1]);
return $site;
}
}
?>
Mappage d'URI des services RESTful
L'URI des services RESTful doit être définie sur une adresse de ressource intuitive et concise. Le fichier .htaccess du serveur Apache doit avoir les règles de réécriture correspondantes configurées.
Dans cet exemple, nous utiliserons deux règles d'URI :
1. Obtenir la liste de tous les sites :
http://localhost/restexample/site/list/
2. Utiliser l'id pour obtenir un site spécifique. L'URI suivante obtient le site avec l'id 3 :
http://localhost/restexample/site/list/3/
Les règles de configuration du fichier .htaccessdu projet sont les suivantes :
# 开启 rewrite 功能
Options +FollowSymlinks
RewriteEngine on
# 重写规则
RewriteRule ^site/list/$ RestController.php?view=all [nc,qsa]
RewriteRule ^site/list/([0-9]+)/$ RestController.php?view=single&id=$1 [nc,qsa]
Contrôleur de service Web RESTful
Dans.htaccessDans le fichier, nous récupérons la requête correspondante dans le fichier RestController.php en définissant le paramètre 'view', et nous la distribuons à différentes méthodes en obtenant différents paramètres de 'view'.RestController.php Le code du fichier est le suivant :
Exemple
<?php
require_once("SiteRestHandler.php");
$view = "";
if(isset($_GET["view"]))
$view = $_GET["view"];
switch($view){
case "all":
$siteRestHandler = new SiteRestHandler();
$siteRestHandler->getAllSites();
break;
case "single":
$siteRestHandler = new SiteRestHandler();
$siteRestHandler->getSite($_GET["id"]);
break;
case "" :
break;
}
?>
Classe de base RESTful simple
Ce qui suit fournit une classe de base pour RESTful, utilisée pour gérer les codes d'état HTTP pour répondre aux requêtes,SimpleRest.phpLe code du fichier est le suivant :
Exemple
<?php
class SimpleRest {
private $httpVersion = "HTTP/1.1";
public function setHttpHeaders($contentType, $statusCode){
$statusMessage = $this -> getHttpStatusMessage($statusCode);
header($this->httpVersion. " ". $statusCode ." ". $statusMessage);
header("Content-Type:". $contentType);
}
public function getHttpStatusMessage($statusCode){
$httpStatus = array(
100 => 'Continuer',
101 => 'Changement de protocole',
200 => 'OK',
201 => 'Créé',
202 => 'Accepté',
203 => 'Information non faisant autorité',
204 => 'Aucun contenu',
205 => 'Réinitialiser le contenu',
206 => 'Contenu partiel',
300 => 'Choix multiples',
301 => 'Déplacé de façon permanente',
302 => 'Trouvé',
303 => 'Voir autre',
304 => 'Non modifié',
305 => 'Utiliser un proxy',
306 => '(Inutilisé)',
307 => 'Redirection temporaire',
400 => 'Requête incorrecte',
401 => 'Non autorisé',
402 => 'Paiement requis',
403 => 'Interdit',
404 => 'Introuvable',
405 => 'Méthode non autorisée',
406 => 'Non acceptable',
407 => 'Authentification proxy requise',
408 => 'Délai d'attente de la requête dépassé',
409 => 'Conflit',
410 => 'Disparu',
411 => 'Longueur requise',
412 => 'Précondition échouée',
413 => 'Entité de requête trop volumineuse',
414 => 'URI de requête trop longue',
415 => 'Type de média non pris en charge',
416 => 'Plage demandée non satisfaisable',
417 => 'Échec de l'attente',
500 => 'Erreur interne du serveur',
501 => 'Non implémenté',
502 => 'Mauvaise passerelle',
503 => 'Service indisponible',
504 => 'Délai d'attente de la passerelle dépassé',
505 => 'Version HTTP non prise en charge');
return ($httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500];
}
}
?>
Classe de gestionnaire de service web RESTful
Ce qui suit est une classe de gestionnaire de service web RESTful SiteRestHandler.php, qui hérite de la classe de base RESTful que nous avons fournie ci-dessus. La classe décide du code d'état HTTP renvoyé et du format de données en évaluant les paramètres de la requête. Dans l'exemple, nous fournissons trois formats de données : "application/json", "application/xml" ou "text/html" :
SiteRestHandler.phpLe code du fichier est le suivant :
Exemple
<?php
require_once("SimpleRest.php");
require_once("Site.php");
class SiteRestHandler extends SimpleRest {
function getAllSites() {
$site = new Site();
$rawData = $site->getAllSite();
if(empty($rawData)) {
$statusCode = 404;
$rawData = array('error' => 'Aucun site trouvé !');
} else {
$statusCode = 200;
}
$requestContentType = $_SERVER['HTTP_ACCEPT'];
$this ->setHttpHeaders($requestContentType, $statusCode);
if(strpos($requestContentType,'application/json') !== false){
$response = $this->encodeJson($rawData);
echo $response;
} else if(strpos($requestContentType,'text/html') !== false){
$response = $this->encodeHtml($rawData);
echo $response;
} else if(strpos($requestContentType,'application/xml') !== false){
$response = $this->encodeXml($rawData);
echo $response;
}
}
public function encodeHtml($responseData) {
$htmlResponse = "<table border='1'>";
foreach($responseData as $key=>$value) {
$htmlResponse .= "<tr><td>". $key. "</td><td>". $value. "</td></tr>";
}
$htmlResponse .= "</table>";
return $htmlResponse;
}
public function encodeJson($responseData) {
$jsonResponse = json_encode($responseData);
return $jsonResponse;
}
public function encodeXml($responseData) {
$xml = new SimpleXMLElement('<?xml version="1.0"?><site></site>');
foreach($responseData as $key=>$value) {
$xml->addChild($key, $value);
}
return $xml->asXML();
}
public function getSite($id) {
$site = new Site();
$rawData = $site->getSite($id);
if(empty($rawData)) {
$statusCode = 404;
$rawData = array('error' => 'Aucun site trouvé !');
} else {
$statusCode = 200;
}
$requestContentType = $_SERVER['HTTP_ACCEPT'];
$this ->setHttpHeaders($requestContentType, $statusCode);
if(strpos($requestContentType,'application/json') !== false){
$response = $this->encodeJson($rawData);
echo $response;
} else if(strpos($requestContentType,'text/html') !== false){
$response = $this->encodeHtml($rawData);
echo $response;
} else if(strpos($requestContentType,'application/xml') !== false){
$response = $this->encodeXml($rawData);
echo $response;
}
}
}
?>
Ensuite, nous accédons via http://localhost/restexample/site/list/, et le résultat de sortie est le suivant :
Client de service Web RESTful
Ensuite, nous pouvons utiliser le « Advance Rest Client » du navigateur Google Chrome comme client de service Web RESTful pour interroger notre service.
Dans l'exemple, demandez l'adresse http://localhost/restexample/site/list/, et les données reçues sont similaires à :Accept: application/json
Demandez le site Example avec l'id 3, l'adresse d'accès est http://localhost/restexample/site/list/3/,

Téléchargement du code source
Le code utilisé dans l'exemple peut être téléchargé en cliquant sur le bouton suivant :
Téléchargement du code source
Autres extensions