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
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"];
switch($view){
case "all":
$siteRestHandler = new SiteRestHandler();
$siteRestHandler->getAllSites();
break;
case "single":
$siteRestHandler = new SiteRestHandler();
$siteRestHandler->getSite($_GET["id"]);
break;
case "" :
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
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) {
$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