REST(Representational State Transfer表述性狀態轉移)是一種針對網絡應用的設計和開發方式,能夠下降開發的複雜性,提升系統的可伸縮性。REST提出了一些設計概念和準則:大理石構件html
一、網絡上的全部事物都被抽象爲資源(resource);json
二、每一個資源對應一個惟一的資源標識(resource identifier);restful
三、經過通用的鏈接器接口(generic connector interface)對資源進行操做;網絡
四、對資源的各類操做不會改變資源標識;app
五、全部的操做都是無狀態的(stateless)。less
須要注意的是,REST是設計風格而不是標準。REST一般基於使用HTTP,URI,和XML以及HTML這些現有的普遍流行的協議和標準。dom
傳統的請求模式和REST模式的請求模式區別:ide
做用 | 傳統模式 | REST模式 |
---|---|---|
列舉出全部的用戶 | GET /users/list | GET /users |
列出ID爲1的用戶信息 | GET /users/show/id/1 | GET /users/1 |
插入一個新的用戶 | POST /users/add | POST /users |
更新ID爲1的用戶信息 | POST /users/mdy/id/1 | PUT /users/1 |
刪除ID爲1的用戶 | POST /users/delete/id/1 | DELETE /users/1 |
關於更多的REST信息,能夠參考:http://zh.wikipedia.org/wiki/RESTpost
3.2的RESTFul支持更爲靈活,你只須要把控制器繼承Think\Controller\RestController便可。 繼承RestController控制器後你的訪問控制器就能夠支持下面的一些功能:ui
- 支持資源類型自動檢測;
- 支持請求類型自動檢測;
- RESTFul方法支持;
- 能夠設置容許的請求類型列表;
- 能夠設置容許請求和輸出的資源類型;
- 能夠設置默認請求類型和默認資源類型;
例如:
namespace Home\Controller;
use Think\Controller\RestController;
class BlogController extends RestController{
}
繼承了RestController後,你能夠在你的控制器裏面設置rest相關的屬性參數,包括:allowMethod,defaultMethod,allowType,defaultType以及allowOutputType。
屬性名 | 說明 | 默認值 |
---|---|---|
allowMethod | REST容許的請求類型列表 | array('get','post','put','delete') |
defaultMethod | REST默認請求類型 | get |
allowType | REST容許請求的資源類型列表 | array('html','xml','json','rss') |
defaultType | REST默認的資源類型 | html |
allowOutputType | REST容許輸出的資源類型列表 | array( 'xml' => 'application/xml', 'json' => 'application/json','html' => 'text/html',) |
RESTFul方法的操做方法定義主要區別在於,須要對請求類型和資源類型進行判斷,大多數狀況下,經過路由定義能夠把操做方法綁定到某個請求類型和資源類型。若是你沒有定義路由的話,須要本身在操做方法裏面添加判斷代碼,示例:
namespace Home\Controller;
use Think\Controller\RestController;
Class InfoController extends RestController {
Public function rest() {
switch ($this->_method){
case 'get': // get請求處理代碼
if ($this->_type == 'html'){
}elseif($this->_type == 'xml'){
}
break;
case 'put': // put請求處理代碼
break;
case 'post': // post請求處理代碼
break;
}
}
}
在Rest操做方法中,可使用$this->_type獲取當前訪問的資源類型,用$this->_method獲取當前的請求類型。
REST控制器類還提供了response方法用於REST輸出: 用法以下:
$this->response($data,'json');
Response方法會自動對data數據進行輸出類型編碼,目前支持的包括xml/json/html
。
除了普通方式定義Restful操做方法外,系統還支持另一種自動調用方式,就是根據當前請求類型和資源類型自動調用相關操做方法。系統的自動調用規則是:
定義規範 | 說明 |
---|---|
操做名提交類型資源後綴 | 標準的Restful方法定義,例如 read_get_pdf |
操做名_資源後綴 | 當前提交類型和defaultMethod屬性相同的時候,例如read_pdf |
操做名_提交類型 | 當前資源後綴和defaultType屬性相同的時候,例如read_post |
要使用這種方式的前提就是不能爲當前操做定義方法,這樣在空操做的檢查以前系統會首先按照上面的定義規範順序檢查是否存在方法定義,若是檢測到相關的restful方法則再也不檢查後面的方法規範,例如咱們定義了InfoController以下:
namespace Home\Controller;
use Think\Controller\RestController;
Class InfoController extends RestController {
protected $allowMethod = array('get','post','put'); // REST容許的請求類型列表
protected $allowType = array('html','xml','json'); // REST容許請求的資源類型列表
Public function read_get_html(){
// 輸出id爲1的Info的html頁面
}
Public function read_get_xml(){
// 輸出id爲1的Info的XML數據
}
Public function read_xml(){
// 輸出id爲1的Info的XML數據
}
Public function read_json(){
// 輸出id爲1的Info的json數據
}
}
若是咱們訪問的URL是:
http://www.domain.com/Info/read/id/1.xml
假設咱們沒有定義路由,這樣訪問的是Info控制器的read操做,那麼上面的請求會調用InfoController類的 read_get_xml
方法,而不是read_xml
方法,可是若是訪問的URL是:
http://www.domain.com/Info/read/id/1.json
那麼則會調用read_json方法。
若是咱們訪問的URL是
http://www.domain.com/Info/read/id/1.rss
因爲咱們不容許rss資源類型的訪問,因此,調用的方法實際上是read_html方法。
咱們能夠藉助3.2的路由參數功能,來解決REST的路由定義問題。 例如,
'blog/:id'=>array('blog/read','status=1',array('ext'=>'xml','method'=>'get')),
上面的路由定義,把blog/5路由到了blog/read/id/5 而且,約束了後綴是xml 請求類型是get。 咱們還能夠定義其餘的路由參數,例如:
'blog/:id'=>array('blog/update','',array('ext'=>'xml','method'=>'put')),
爲了確保定義不衝突,REST路由定義咱們一般改爲下面的定義方式:
array('blog/:id','blog/read','status=1',array('ext'=>'xml','method'=>'get')),
array('blog/:id','blog/update','',array('ext'=>'xml','method'=>'put')),
這樣就能夠給相同的路由規則定義不一樣的參數支持。定義了REST路由後,你的rest方法定義就不受任何約束,固然,若是路由定義的操做方法不存在的時候,系統默認的rest方法規範仍然會有效。