PHP RESTful


REST (anglais : Representational State Transfer, appelé REST) ​​​​​​fait référence à un ensemble de contraintes et de principes architecturaux.

L'API Web conforme au style de conception REST est appelée API RESTful. Elle est définie à partir des trois aspects de ressources suivants :

  • Adresse de ressource intuitive et courte : URI, telle que : http://example.com/resources/.

  • Ressources transmises : types de médias Internet acceptés et renvoyés par le service web, tels que : JSON, XML, YAM, etc.

  • Opérations sur la ressource : une série de méthodes de requête prises en charge par le service Web sur la ressource (telles que : POST, GET, PUT ou DELETE).

Dans ce tutoriel nous utiliserons PHP (sans framework) pour créer un service web RESTful A la fin de l'article vous pourrez télécharger le code utilisé dans ce chapitre.

Grâce à ce tutoriel, vous apprendrez ce qui suit :

  • Créer un Webservice RESTful.

  • Utilise PHP natif et ne s'appuie sur aucun framework.

  • Le modèle URI doit suivre les règles REST.

  • Le format accepté et renvoyé par le service RESTful peut être JSON, XML, etc.

  • Répondez au code d'état HTTP correspondant selon différentes situations.

  • Démontre l'utilisation des en-têtes de requête.

  • Utilisez le client REST pour tester le service Web RESTful.


Instance de service Web RESTful

Le code suivant est la classe de service RESTful Site.php :

Instance

<?php
/*
* Exemple de démonstration RESTful de site Web chinois php
* Service RESTful Classe
*/
Classe Site {

privé
$sites = array(
 
=> 'TaoBao'
 
2 => php',                                                                                                               🎜>  5
=> , 6 => >'Sina' 
 
);   public function getAllSite
(){
return $this->sites
;
>     public function 
getSite($id){
        
        
$site = array($id => ($this->sites [$id]) ?  $this->sites[$id] : $this->sites[1]);
        retour 
$site;
    }    
}
?>

Mappage de l'URI des services RESTful

L'URI des services RESTful doit être défini sur une adresse de ressource intuitive et courte. Le .htaccess du serveur Apache doit avoir un ensemble de règles de réécriture correspondantes.

Dans cet exemple, nous utiliserons deux règles URI :

1. Obtenez une liste de tous les sites :

http://localhost/restexample/site/list/

2. Utilisez l'identifiant pour obtenir le site spécifié, le. L'URI suivant consiste à obtenir l'identifiant. Pour un site de 3 :

http://localhost/restexample/site/list/3/

les règles de configuration du fichier .htaccess du 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= [nc,qsa]

RESTful Web Service Controller

Dans le fichier .htaccess, nous obtenons la requête correspondante dans le fichier RestController.php en définissant le paramètre 'view', et la distribuons à différentes méthodes en obtenant différents paramètres de 'view '. RestController.php Le code du fichier est le suivant :

实例

<?php
require_once("SiteRestHandler.php");
        
$view "";
if(isset(
$_GET&#91;"view"]))
    
$view  $_GET&#91;"view"];
/*
 * Service RESTful 控制器
 * URL 映射
*/
switch($view){

    cas 
"tous":
        
// 处理 REST Url /site/list/
        
$siteRestHandler = nouveau SiteRestHandler();
        
$siteRestHandler->getAllSites();
        break;
        
    cas 
"single" :
        
// 处理 REST Url /site/show/<id>/
        
$siteRestHandler = nouveau SiteRestHandler();
        
$siteRestHandler->getSite($_GET["id"]);
        break;

    case 
"" :
        
//404 - int trouvé;
        
break;
}
?>

Classe de base RESTful simple

Ce qui suit fournit une classe de base RESTful pour traiter les codes d'état HTTP en réponse aux requêtes. Le code du fichier SimpleRest.php est le suivant :

Instance

<?php
/*
* Une simple classe de base de services Web RESTful
* Nous peut étendre les exigences en fonction de cette classe
*/
classe SimpleRest {

 privée
$httpVersion = "HTTP/1.1";

fonction publique
setHttpHeaders($contentType, $statusCode){
 
 
$statusMessage  = $this -> getHttpStatusMessage($statusCode);
 
 
en-tête($this->httpVersion. " ". $statusMessage); en-tête("Type de contenu :" . 🎜>$contentType);
}
fonction publique getHttpStatusMessage($statutCode){        
$httpStatus = array(
            
100 => 'Continuer',  
            
101 =>  'Changement de protocoles',  
            
200 =>  'OK',
            
201 =>  'Créé ',  
            
202 =>  'Accepté',  
            
203 =>  'Informations non autorisées',  
            
204 => 'Aucun contenu',  
            
205 =>  'Réinitialiser le contenu',  
            
206 =>  'Contenu partiel',  
            
300 =>  'Choix multiples',  
            
301 => 'Déplacé Définitivement',  
            
302 => 'Trouvé',  
            
303 => 'Voir Autres',  
            
304 => 'Non Modifié',  
            
305 => 'Utiliser Proxy',  
            
306 => '(Inutilisé)',  
            
307 => 'Redirection temporaire',  
            
400 => 'Demande mauvaise',  
            
401 => 'Non autorisé',  
            
402 => 'Paiement obligatoire',  
            
403 => 'Interdit',  
            
404 => 'Introuvable',  
            
405 => 'Méthode Non autorisée',  
            
406 => 'Pas Acceptable',  
            
407 => 'Authentification proxy obligatoire',  
            
408 => 'Demande d'expiration',  
            
409 => 'Conflit',  
            
410 => 'Parti',  
            
411 => 'Longueur obligatoire',  
            
412 => 'Échec de la condition préalable',  
            
413 => 'Demande Entité trop grande',  
            
414 => 'URI de demande trop long',  
            
415 => 'Type de média non pris en charge',  
            
416 => 'Plage demandée non satisfiable',  
            
417 => 'Attente Échec',  
            
500 => 'Erreur du serveur interne",  
            
501 => 'Non implémenté',  
            
502 => 'Mauvaise passerelle,  
            
503 => 'Service Indisponible',  
            
504 => 'Délai d'expiration de la passerelle',  
            
505 => 'Version HTTP non prise en charge');
        return (
$httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500];
    }
}
?>

Classe de traitement de service Web RESTful

Ce qui suit est une classe de traitement de service Web RESTful SiteRestHandler.php, qui hérite de la classe de base RESTful que nous avons fournie ci-dessus. Dans la classe, le code d'état HTTP renvoyé est déterminé en jugeant. les paramètres de la requête et le format des données. Dans l'exemple, nous fournissons trois formats de données : "application/json", "application/xml" ou "text/html" :

SiteRestHandler.php Le code du fichier est le suivant :

实例

<?php 
require_once("SimpleRest.php");
require_once(
"Site.php");

class 
SiteRestHandler étend SimpleRest {

    fonction 
getAllSites() {    

        
$site = nouveau Site();
        
$rawData $site->getAllSite();

        if(empty(
$rawData)) {
            
$statusCode 404;
            
$rawData  = array('erreur' => 'Aucun sites 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') !== faux){
             
$response $this->encodeHtml($rawData);
            echo 
$response;
        } else if(
strpos($requestContentType,'application/xml') !== false){
            
$response $this->encodeXml($rawData);
            echo 
$response;
        }
    }
    
    fonction publique 
encodeHtml($responseData) {
    
        
$htmlResponse "<table border='1'>";
        foreach(
$responseData as $ key=>$value) {
               
$htmlResponse .= "<tr><td>"$clé"</td><td>"Valeur $"</td></tr>";
        }
        
$htmlRéponse .= "</table>";
        retour 
$htmlRéponse;        
    }
    
    public function 
encodeJson($responseData) {
        
$jsonResponse = json_encode($responseData);
        return 
$jsonResponse;        
    }
    
    fonction publique 
encodeXml($responseData) {
        
// 创建 SimpleXMLElement 对象
        
$xml = nouveau SimpleXMLElement('<?xml version="1.0"?><site></site>');
        foreach(
$responseData as $key=>$value) {
            
$xml->addChild($key$value);
         }
        retour 
$xml->asXML();
    }
    
    fonction publique 
getSite($id) {

        
$site = new Site();
        
$rawData $site->getSite($id);

        if(empty(
$rawData)) {
            
$statusCode 404;
            
$rawData = array('error' => 'No sites found!');        
        } 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') !== faux){
             
$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/, les résultats de sortie sont les suivants :

restful1.jpg


Service Web RESTful Client

Ensuite, nous pouvons utiliser le "Advance Rest Client" du navigateur Google Chrome comme client de service Web RESTful pour demander nos services.

Demandez l'adresse http://localhost/restexample/site/list/ dans l'instance, et les données reçues sont similaires à Accepter : application/json

restful2.jpg

Demandez le site php avec l'identifiant 3 (site php chinois), l'adresse d'accès est http://localhost/restexample/site/list/3/,

restful3.jpg

Téléchargement du code source

Le code utilisé dans l'exemple peut être téléchargé en cliquant sur le bouton ci-dessous :

Téléchargement du code source