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中文网 RESTful 演示实例
* RESTful 服务类
*/
Class Site {
private $sites = array(
1 => 'TaoBao',
2 => 'Google',
3 => 'php',
4 => 'Baidu',
5 => 'Weibo',
6 => '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 文件代码如下:
实例
require_once("SiteRestHandler.php");
$view = "";
if(isset($_GET["view"]))
$view = $_GET["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 文件代码如下:
实例
/*
* 一个简单的 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("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>";
返回$htmlResponse;
}
公共函数 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/ 访问,输出结果如下:
RESTful Web Service 客户端
接下来我们可以使用 Google Chrome 浏览器的 "Advance Rest Client" 作为 RESTful Web Service 客户端来请求我们的服务。
实例中请求 http://localhost/restexample/site/list/ 地址,接收数据类似为 Accept: application/json
请求 id 为 3 的站点 php(php中文网),访问地址为 http://localhost/restexample/site/list/3/,
源码下载
实例中使用到的代码可点击以下按钮下载:
源码下载