Rest控制器
Rest控制器
新版(ban)不再(zai)推薦使(shi)用Rest控制(zhi)器,建議(yi)用資源控制(zhi)器替代。下一個大版(ban)本即將廢棄。
如果需要讓你的控制器支持RESTful的話,可以使用Rest控制器,在定義訪問控制器的時候直接繼承think\controller\Rest即可,例如:
namespace app\index\controller;
use think\controller\Rest;
class Blog extends Rest
{
}
配合示例(li)需要,我(wo)們首(shou)先在應用配置(zhi)文件(jian)中添加:
// URL偽靜態后綴
'url_html_suffix' => 'html|xml|json|jsonp',
RESTFul方法定義
RESTFul方(fang)(fang)法和標準模(mo)式的操作方(fang)(fang)法定(ding)義(yi)主要區別在于,需要對(dui)請求類型和資(zi)源(yuan)類型進行(xing)判(pan)斷(duan),大多數情況(kuang)下(xia),通過路由定(ding)義(yi)可以把操作方(fang)(fang)法綁定(ding)到(dao)某個請求類型和資(zi)源(yuan)類型。如果你沒有(you)定(ding)義(yi)路由的話,需要自己(ji)在操作方(fang)(fang)法里面(mian)添加判(pan)斷(duan)代碼(ma),示例:
<?php
namespace app\index\controller;
use think\controller\Rest;
class Blog extends Rest
{
public function rest()
{
switch ($this->method){
case 'get': // get請求處理代碼(ma)
if ($this->type == 'html'){
} elseif ($this->type == 'xml'){
}
break;
case 'put': // put請求處理代碼(ma)
break;
case 'post': // post請求處(chu)理代碼(ma)
break;
}
}
}
在Rest操作方法中,可以使用$this->type獲取當前訪問的資源類型,用$this->method獲(huo)取當前的請求類型。
RESTFul 輸出
使用Rest類提供的 response 方法
$this->response($data, 'json', 200);
使用think\Response類
Response::create($data, 'json')->code(200);
使用助手函數
json($data, 200);
$data為需要輸出的數據,第二個參數為輸出數據的http狀態碼
方(fang)法會自(zi)動對$data數(shu)據進行輸(shu)出類型編(bian)碼(ma),目前支持(chi)的包括xml,json,jsonp,html等(deng)編(bian)碼(ma)格式輸(shu)出,例如(ru):
// 輸出 json 格式數據
json($data, 200);
// 輸出 jsonp 格式數據
jsonp($data, 200);
// 輸出(chu) xml 格式數據
xml($data, 200);
除了(le)普通方(fang)式定義(yi)Restful操作方(fang)法(fa)外,系統還支持另外一種自動(dong)調用(yong)(yong)方(fang)式,就是根據(ju)當前(qian)請求(qiu)類型(xing)和資(zi)源類型(xing)自動(dong)調用(yong)(yong)相關操作方(fang)法(fa)。系統的自動(dong)調用(yong)(yong)規則(ze)是:
| 定義規范 | 說明 |
|---|---|
| 操作名_提交類型_資源后綴 | 標準的Restful方法定義,例如 read_get_pdf |
| 操作名_資源后綴 | 當前提交類型和restDefaultMethod相同的時候,例如read_pdf |
| 操作名_提交類型 | 當前資源后綴和restDefaultType相同的時候,例如read_post |
這種方式(shi)的(de)rest方法(fa)定義(yi)采用(yong)(yong)了空操(cao)作(zuo)機制,所(suo)以要使用(yong)(yong)這種方式(shi)的(de)前提就是(shi)不(bu)能(neng)為當前操(cao)作(zuo)定義(yi)方法(fa),如果(guo)檢(jian)測到(dao)相關的(de)restful方法(fa)則不(bu)再檢(jian)查后面的(de)方法(fa)規(gui)范,例如我們定義(yi)了InfoController如下(xia):
namespace app\index\controller;
use think\controller\Rest;
class Info extends Rest
{
public function read_get_xml($id)
{
// 輸出id為1的Info的XML數據
}
public function read_xml($id)
{
// 輸出id為1的Info的XML數據
}
public function read_json($id)
{
// 輸出(chu)id為1的Info的json數據
}
}
如果我(wo)們訪問的(de)URL是(shi):
//serverName/index/info/read/id/1.xml
假設我們(men)沒有定義(yi)路由,這樣訪問(wen)(wen)的(de)是Info模塊(kuai)的(de)read操作,那(nei)么(me)上(shang)面的(de)請求(qiu)會調用Info類的(de) read_get_xml方法(fa),而不是read_xml方法(fa),但是如果訪問(wen)(wen)的(de)URL是:
http://serverName/index/info/read/id/1.json
那么則會(hui)調(diao)用read_json方法。
