PHP RESTful

REST (en inglés: Representational State Transfer, abreviado REST) se refiere a un conjunto de condiciones y principios de restricción arquitectónica.

Las API web que cumplen con el estilo de diseño REST se denominan API RESTful. Se definen a partir de los siguientes tres aspectos de recursos:

  • Dirección de recurso intuitiva y corta: URI, por ejemplo:http://example.com/resources/。
  • Recurso transferido: tipos de medios de Internet que el servicio web acepta y devuelve, por ejemplo: JSON, XML, YAM, etc.
  • Operaciones sobre el recurso: la serie de métodos de solicitud admitidos por el servicio web sobre el recurso (por ejemplo: POST, GET, PUT o DELETE).

En este tutorial usaremos PHP (sin framework) para crear un servicio web RESTful; al final del artículo podrás descargar el código utilizado en este capítulo.

A través de este tutorial aprenderás lo siguiente:

  • Crear un servicio web RESTful.
  • Usar PHP nativo, sin depender de ningún framework.
  • El patrón de URI debe seguir las reglas de REST.
  • El formato que acepta y devuelve el servicio RESTful puede ser JSON, XML, etc.
  • Responder con el código de estado HTTP correspondiente según la situación.
  • Demostrar el uso de los encabezados de solicitud.
  • Usar un cliente REST para probar el servicio web RESTful.

Ejemplo de Webservice RESTful

El siguiente código es la clase de servicio RESTfulSite.php:

Ejemplo

<?php /** Ejemplo de demostración RESTful de Ejemplo * Clase de servicio RESTful*/ Class Site { private $sites = array( 1 => 'TaoBao', 2 => 'Google', 3 => 'Ejemplo', 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; } } ?>

Mapeo de URI de servicios RESTful

La URI de los servicios RESTful debe establecerse como una dirección de recurso intuitiva y corta. El archivo .htaccess del servidor Apache debe tener configuradas las reglas de Rewrite correspondientes.

En este ejemplo usaremos dos reglas de URI:

1. Obtener la lista de todos los sitios:

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

2. Usar id para obtener el sitio especificado; la siguiente URI obtiene el sitio con id 3:

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

del proyecto .htaccessLas reglas de configuración del archivo son las siguientes:

# 开启 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]

Controlador de servicio web RESTful

En.htaccessEn el archivo, mediante el parámetro 'view' obtenemos la solicitud correspondiente en el archivo RestController.php; según los diferentes valores del parámetro 'view', se distribuye a diferentes métodos.RestController.php El código del archivo es el siguiente:

Ejemplo

<?php require_once("SiteRestHandler.php"); $view = ""; if(isset($_GET["view"])) $view = $_GET["view"]; /** Controlador de servicio RESTful * Mapeo de URL*/ switch($view){ case "all": //Manejar la URL REST /site/list/ $siteRestHandler = new SiteRestHandler(); $siteRestHandler->getAllSites(); break; case "single": //Manejar la URL REST /site/show/<id>/ $siteRestHandler = new SiteRestHandler(); $siteRestHandler->getSite($_GET["id"]); break; case "" : //404 - not found; break; } ?>

Clase base RESTful simple

A continuación se proporciona una clase base de RESTful, utilizada para manejar los códigos de estado HTTP de las solicitudes de respuesta.SimpleRest.phpEl código del archivo es el siguiente:

Ejemplo

<?php /** Una clase base simple de servicios web RESTful * Podemos extender los requisitos basándonos en esta clase*/ 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 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => '(Unused)', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported'); return ($httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500]; } } ?>

Clase de manejo de servicio web RESTful

El siguiente es una clase de manejo de servicio web RESTful, SiteRestHandler.php, que hereda de la clase base RESTful que proporcionamos anteriormente. En la clase, se decide el código de estado HTTP y el formato de datos devueltos según los parámetros de la solicitud. En el ejemplo, proporcionamos tres formatos de datos: "application/json", "application/xml" o "text/html":

SiteRestHandler.phpEl código del archivo es el siguiente:

Ejemplo

<?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' => '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') !== 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) { //Crear un objeto SimpleXMLElement $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' => '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') !== false){ $response = $this->encodeHtml($rawData); echo $response; } else if(strpos($requestContentType,'application/xml') !== false){ $response = $this->encodeXml($rawData); echo $response; } } } ?>

A continuación, accedemos a http://localhost/restexample/site/list/ y el resultado de salida es el siguiente:


Cliente de servicio web RESTful

A continuación, podemos usar "Advance Rest Client" del navegador Google Chrome como cliente de servicio web RESTful para solicitar nuestro servicio.

En el ejemplo, al solicitar la dirección http://localhost/restexample/site/list/, los datos recibidos son similares a:Accept: application/json

Al solicitar el sitio Ejemplo (Tutorial de novatos) con id 3, la dirección de acceso es http://localhost/restexample/site/list/3/,

Descargar código fuente

El código utilizado en el ejemplo se puede descargar haciendo clic en el siguiente botón:

Descargar código fuente

Otras extensiones