PHP RESTful


REST(英文:Representational State Transfer,简称REST) ,指的是一组架构约束条件和原则。

符合REST设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:

  • 直观简短的资源地址:URI,比如:http://example.com/resources/

  • 传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAM等。

  • 对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。

本教程我们将使用 PHP(不用框架) 来创建一个 RESTful web service,在文章末尾你可以下载本章节使用到的代码。

通过本教程你将学习到以下内容:

  • 创建一个 RESTful Webservice。

  • 使用原生 PHP, 不依赖任何框架。

  • URI 模式需要遵循 REST 规则。

  • RESTful service 接受与返回的格式可以是 JSON, XML等。

  • 根据不同情况响应对应的 HTTP 状态码。

  • 演示请求头的使用。

  • 使用 REST 客户端来测试 RESTful web service。


RESTful Webservice 实例

以下代码是 RESTful 服务类 Site.php

实例

<?php
/* 
 * php中文网 RESTful 演示实例
 * RESTful 服务类
 */
Class Site {
    
    private 
$sites = array(
        
=> 'TaoBao',  
        
=> 'Google',  
        
=> 'php',              
        
=> 'Baidu',              
        
=> 'Weibo',  
        
=> 'Sina'
            
    
);
        
    
    public function 
getAllSite(){
        return 
$this->sites;
    }
    
    公共函数 
getSite($id){
        
        
$site = 数组($id => ( $这个->网站 [$id]) ? $这个->网站[$id] : $这个->网站[ 1]);
        返回
$site;
    }    
}
?>

RESTful Services URI 映射

RESTful Services URI 应该设置为一个直观简短的资源地址。Apache 服务器的 .htaccess 应设置好对应的 Rewrite 规则。

本实例我们将使用两个 URI 规则:

1、获取所有站点列表:

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

2、使用 id 获取指定的站点,以下 URI 为获取 id 为 3 的站点:

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

项目的 .htaccess 文件配置规则如下所示:

# 开启 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 控制器

.htaccess 文件中,我们通过设置参数 'view' 来获取 RestController.php 文件中对应的请求,通过获取 'view' 不同的参数来分发到不同的方法上。RestController.php 文件代码如下:

实例

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

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

    case 
"" :
        
// 404 - 未找到;
        
中断;
}
?>

简单的 RESTful 基础类

以下提供了 RESTful 的一个基类,用于处理响应请求的 HTTP 状态码,SimpleRest.php 文件代码如下:

实例

<?php 
/*
 * 一个简单的 RESTful web services 基类
 * 我们可以基于这个类来扩展需求
*/
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 = 数组(
            
100 => '继续',  
            
101 =>  '切换协议',  
           
200  =>  '好的',
            
201 =>  '已创建',  
            
202 => '已接受',  
            
203  =>  '非权威信息',  
           
204 =>  '无内容',  
            
205 => “重置内容” ,  
            
206 =>  '部分内容',  
            
300 => '多项选择',  
            
301 => '永久移动',  
            
302 =>; “找到”,  
            
303 => “查看其他”,  
            
304 => '未修改',  
            
305 => “使用代理”,  
            
306 => '(未使用)',  
            
307 => '临时重定向',  
            
400 => '错误请求',  
            
401 =>; ‘未经授权’,  
            
402 => “需要付款”,  
            
403 => “禁止”,  
            
404 =>; “未找到”,  
            
405 => “不允许的方法”,  
            
406 => '不可接受',  
            
407 =>; “需要代理身份验证”,  
            
408 => '请求超时',  
            
409 => '冲突',  
            
410 => “走了”,  
            
411 => '长度必填',  
            
412 => “前提条件失败”,  
            
413 => '请求实体太大',  
            
414 =>; '请求 URI 太长',  
            
415 =>; '不支持的媒体类型',  
            
416 =>; '请求的范围无法满足',  
            
417 =>; '期望落空',  
            
500 => '内部服务器错误',  
            
501 =>; '未实施',  
            
502 =>; '坏网关',  
            
503 =>; '服务不可用',  
            
504 =>; “网关超时”,  
            
505 => '不支持 HTTP 版本');
        返回 (
$httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500];
    }
}
?>

RESTful Web Service 处理类

以下是一个 RESTful Web Service 处理类 SiteRestHandler.php,继承了上面我们提供的 RESTful 基类,类中通过判断请求的参数来决定返回的 HTTP 状态码及数据格式,实例中我们提供了三种数据格式: "application/json" 、 "application/xml" 或 "text/html":

SiteRestHandler.php 文件代码如下:

实例

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

class
SiteRestHandler扩展SimpleRest {

    函数 
getAllSites() {    

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

        if(empty(
$rawData)) {
            
$statusCode 404 ;
            
$rawData = 数组( '错误' => '找不到网站!');        
        } 其他 {
            
$statusCode 200;
        }

        
$requestContentType $_SERVER['HTTP_ACCEPT'];
        
$这个->setHttpHeaders($requestContentType$statusCode);
                
        如果(
strpos($requestContentType,' application/json') !== false){
            
$响应 $这个->encodeJson( $rawData);
            回声
$response;
        } else if(
strpos($requestContentType,'text/html') !== false ){
            
$回复$这个->encodeHtml($rawData);
            echo 
$响应;
        } else if(
strpos($requestContentType ,'应用程序/xml') !== ){
            
$响应$这个->encodeXml($rawData);
            echo 
$响应;
        }
    }
    
    公共函数 
encodeHtml ($responseData) {
    
        
$htmlResponse "<table border='1'>";
        foreach(
$responseData as $ key=>$value) {
                
$htmlResponse .= "<tr><td>"$钥匙。 “</td><td>”。 $价值。 "</td></tr>";
        }
        
$htmlResponse .= "</table>";
        返回
$h​​tmlResponse;        
    }
    
    公共函数 
encodeJson($responseData) {
        
$jsonResponse json_encode($responseData );
        返回
$jsonResponse;        
    }
    
    公共函数 
encodeXml($responseData) {
        
//  创建 SimpleXMLElement 对象
        
$xml = 新SimpleXMLElement(');
        foreach(
$responseData as $key=>$value) {
$xml->addChild($key$value);
        }
        return 
$xml ->asXML() ;
    }
    
    公共函数 
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'];
        
$这个->setHttpHeaders($requestContentType$statusCode);
                
        如果(
strpos($requestContentType,' application/json') !== false){
            
$响应 $这个->encodeJson( $rawData);
            回声
$response;
        } else if(
strpos($requestContentType,'text/html') !== false ){
            
$回复$这个->encodeHtml($rawData);
            echo 
$响应;
        } else if(
strpos($requestContentType ,'应用程序/xml') !== ){
            
$response $this->encodeXml($rawData);
            echo 
$response;
        }
    }
}
?>

接下来我们通过 http://localhost/restexample/site/list/ 访问,输出结果如下:

restful1.jpg


RESTful Web Service 客户端

接下来我们可以使用 Google Chrome 浏览器的 "Advance Rest Client" 作为 RESTful Web Service 客户端来请求我们的服务。

实例中请求 http://localhost/restexample/site/list/ 地址,接收数据类似为 Accept: application/json

restful2.jpg

请求 id 为 3 的站点 php(php中文网),访问地址为 http://localhost/restexample/site/list/3/,

restful3.jpg

源码下载

实例中使用到的代码可点击以下按钮下载:

源码下载