【小(xiǎo)編推薦】ThinkPHP3.2——RESTFul

2014-06-26   |​•<π   發布者:梁國(guóα&♣←)芳   |   ​©<;查看(kàn):3320次

Thinkphp

REST介紹

REST(Representational State¥≠♥≈ Transfer表述性狀态轉移)是(shì)÷✔一(yī)種針對(duì)網絡應用(yòng)的(de)設計(j♣¥☆‍ì)和(hé)開(kāi)發方式,可(kě)以降低(dī)開(kāi)發的(&£de)複雜(zá)性,提高(gāo)系統的(de)£π↑可(kě)伸縮性。REST提出了(le)一(yī)些(xiλ✘ē)設計(jì)概念和(hé)準則:

1、網絡上(shàng)的(de)所有(♦✘yǒu)事(shì)物(wù)都(dōu)被抽象為(wèi∞λ )資源(resource);

2、每個(gè)資源對(duì)應一(yī)個(gè)唯一(yī σ₹)的(de)資源标識(resource iden∏÷♦tifier);

3、通(tōng)過通(tōng)用(yòng)的(de)連接器(qì)♣>δ→接口(generic connector interface≈•₩¶)對(duì)資源進行(xíng)操作(zuò);

4、對(duì)資源的(de)各種操作(zuò)不(bù)會(huì)改δ'✘變資源标識;

5、所有(yǒu)的(de)操作(zuò)都(dōu)是(shì)無&≠狀态的(de)(stateless)。

需要(yào)注意的(de)是(shì),REST是(shì)設計(jì)∞₽±風(fēng)格而不(bù)是(shì)标準。REST通(tōng)常基$✘α 于使用(yòng)HTTP,URI,和(hé)XMLφα以及HTML這(zhè)些(xiē)現(xiàn)有(yǒu)的(de)廣♣α泛流行(xíng)的(de)協議(yì)和(hé)标 ←準。

傳統的(de)請(qǐng)求模式和(hé)REST模式的(de)請(qǐng∑α<)求模式區(qū)别:

作(zuò)用(yòng) 傳統模式 REST模式
列舉出所有(yǒu)的(de)用(yòng)戶 GET /users/list GET /users
列出ID為(wèi)1的(de)用(yòn₩↔g)戶信息 GET /users/show/id/1 GET /users/1
插入一(yī)個(gè)新的(de)用(yòng)戶 POST /users/add POST /users
更新ID為(wèi)1的(de)用(yòng)戶信息 POST /users/mdy/id/1 PUT /users/1
删除ID為(wèi)1的(de)用(yòng)戶 POST /users/delete/id/1 delete /users/1

關于更多(duō)的(de)REST信息,可(kě)≈↑以參考:http://zh.wikipedia.org/wiki/RES×♦​T

RESTFul支持

3.2的(de)RESTFul支持更為(wèi)靈活,你(nǐ)₽♠π↕不(bù)需要(yào)使用(yòng)REST模式,✔∞>✔隻需要(yào)把控制(zhì)器(qì)繼承↔£✔βThink\Controller\RestContr±∑σoller即可(kě)。 繼承RestController控γ≤制(zhì)器(qì)後你(nǐ)的(de)訪問(wèn)控↔₽₩制(zhì)器(qì)就(jiù)可(kě)以支持下(xi↓  ¶à)面的(de)一(yī)些(xiē)功能(néng):

例如(rú):

  1. namespace Home\Controller;
  2. use Think\Controller\RestControl‍ §↑ler;
  3. class BlogController extends RestController{
  4. }

REST參數(shù)

繼承了(le)RestController後,你(nǐ)可(kě  ♣₩)以在你(nǐ)的(de)控制(zhì)器(qì)裡(lǐ)面設置res€©§t相(xiàng)關的(de)屬性參數(shù),包括:a★→£‌llowMethod,defaultMethod,all₹♠≥→owType,defaultType以及allowOutpφ♠£utType。

屬性名 說(shuō)明(míng) 默認值
allowMethod REST允許的(de)請(qǐng)求類型列表 array('get','post','put'↕↓,'delete')
defaultMethod REST默認請(qǐng)求類型 get
allowType REST允許請(qǐng)求的(de)資源類¶÷≠α型列表 array('html','xml','json','rss')
defaultType REST默認的(de)資源類型 html
allowOutputType REST允許輸出的(de)資源類型列表 array( 'xml' => 'ap→®÷≠plication/xml', 'json' => 'ap ↕plication/json','html' =&g↔€t; 'text/html',)

REST方法

RESTFul方法的(de)操作(zuò)方法定義主要(yào)區('±qū)别在于,需要(yào)對(duì)請(qǐng)求類型和≈×₹(hé)資源類型進行(xíng)判斷,大(dà)多(du↓¶→≈ō)數(shù)情況下(xià),通(tōng)過路(lù)由定義可™¶♥<(kě)以把操作(zuò)方法綁定到(dào)某個(gè)請(qσ✘ǐng)求類型和(hé)資源類型。如(rú)果你(nǐ)沒有(y$σ πǒu)定義路(lù)由的(de)話(huà),需要(y ∞πào)自(zì)己在操作(zuò)方法裡(lǐ)面添≥→ 加判斷代碼,示例:

  1. namespace Home\Controller;
  2. use Think\Controller\RestControl ∞•ler;
  3. Class InfoController extends RestController {
  4. Public function rest() {
  5. switch ($this->_method){
  6. case 'get': // get請(qǐng)求處理(lǐ)代碼
  7. if ($this->_type == 'html'){
  8. }elseif($this->_type == 'xml'){
  9. }
  10. break;
  11. case 'put': // put請(qǐng)求處理(lǐ)代碼
  12. break;
  13. case 'post': // post請(qǐng)求處理(lǐ)代碼
  14. break;
  15. }
  16. }
  17. }

在Rest操作(zuò)方法中,可(kě)以使 ↑÷$用(yòng)$this->_typ®₹®e獲取當前訪問(wèn)的(de)資源類型,用(yòng)$t∑φ$his->_method獲取當前的(de)請(qǐng)求類型。

REST控制(zhì)器(qì)類還(hδ$$ái)提供了(le)response方法用(yòng)于REST輸出: ​γ 用(yòng)法如(rú)下(xià):

  1. $this->response($data,'json');

Response方法會(huì)自(zì)動對(duì)data數(sh™↕ù)據進行(xíng)輸出類型編碼,目前支持的(de)包括xml/json/html

除了(le)普通(tōng)方式定義Re§✔♥stful操作(zuò)方法外(wài),系統還(hái)支持另外ε♣§¶(wài)一(yī)種自(zì)動調用(yòng)方式,就&ε× (jiù)是(shì)根據當前請(qǐng)求類型和(hé)資÷↕©源類型自(zì)動調用(yòng)相(xiàng)關操作(zu≤​λ≈ò)方法。系統的(de)自(zì)動調用(yòng)規則是(shìσλ φ):

定義規範 說(shuō)明(míng)
操作(zuò)名提交類型資源後綴 标準的(de)Restful方法定義,例€₩←如(rú) read_get_pdf
操作(zuò)名_資源後綴 當前提交類型和(hé)defaultMetβ♠hod屬性相(xiàng)同的(de)時(s↑λ★hí)候,例如(rú)read_pdf
操作(zuò)名_提交類型 當前資源後綴和(hé)defaultType屬性相(Ω±™'xiàng)同的(de)時(shí)候,例如(rú)​< read_post

要(yào)使用(yòng)這(zhè)種方式的(de)σ×±<前提就(jiù)是(shì)不(bù)能(néng)為(wèi)當前操 ¶作(zuò)定義方法,這(zhè)樣在空(kōng)操作(zuò)的(d±♠♠αe)檢查之前系統會(huì)首先按照(zhào)>✘ 上(shàng)面的(de)定義規範順序檢查是(shì)否存在方法定>®義,如(rú)果檢測到(dào)相(xiàng)關的(de)re © stful方法則不(bù)再檢查後面的(dφ₹$e)方法規範,例如(rú)我們定義了(le)© InfoController如(rú)下(xià):

  1. namespace Home\Controller;
  2. use Think\Controller\RestController;
  3. Class InfoController extends RestController {
  4. protected $allowMethod = array('get','post','put'), // REST允許的(de)請(qǐng)★"→求類型列表
  5. protected $allowType = array('html','xml','json'), // REST允許請(qǐng)求的(de)資源類型÷"列表
  6.  
  7. Public function read_get_html(){
  8. // 輸出id為(wèi)1的(de)Info的(de)ht£​→←ml頁面
  9. }
  10.  
  11. Public function read_get_xml(){
  12. // 輸出id為(wèi)1的(de)Info的£β(de)XML數(shù)據
  13. }
  14. Public function read_xml(){
  15. // 輸出id為(wèi)1的(de)Info的₩←(de)XML數(shù)據
  16. }
  17. Public function read_json(){
  18. // 輸出id為(wèi)1的(de)Info的(de₹♥<™)json數(shù)據
  19. }
  20. }

如(rú)果我們訪問(wèn)的(de)URL是(shì):

  1. http://www.domain.com/Info/read/id/1.xml​"&β

假設我們沒有(yǒu)定義路(lù)由,這(zhè)樣訪問(wèn)的(de→∞)是(shì)Info控制(zhì)器(qì)的(de)read操作(zu§© ò),那(nà)麽上(shàng)面的(de)請(qǐng)求會(huì)調用₽∑(yòng)InfoController類的(de) read_get_xml方法,而不(bù)是(shì)read_xml方法,但(dàn)是(shì)如(rú)果訪問(wè₹α×n)的(de)URL是(shì):

  1. http://www.domain.com/Inf≥₹→o/read/id/1.json

那(nà)麽則會(huì)調用(yòng)read_json方法。

如(rú)果我們訪問(wèn)的(de)URL是(shì)

  1. http://www.domain.com/InfΩ>♥o/read/id/1.rss

由于我們不(bù)允許rss資源類型的(de)訪問(wèn),所以,調用(y♥₩£"òng)的(de)方法其實是(shì)read_html方法。

REST路(lù)由

我們可(kě)以借助3.2的(de)路(lù)♣±↑<由參數(shù)功能(néng),來(lái)解決REST™×的(de)路(lù)由定義問(wèn)題。 例如(rú),

  1. 'blog/:id'=>array('blog/read','status=1',array('ext'=>'xml','method'=>'get')),

上(shàng)面的(de)路(lù)由定♦∏↔ 義,把blog/5路(lù)由到(dào)了(le)blog/read×" /id/5 并且,約束了(le)後綴是(shì)xml 請(qǐng)求類型是 ₩ ™(shì)get。 我們還(hái)可(kě)以€€定義其他(tā)的(de)路(lù)由參數(γ↑©shù),例如(rú):

  1. 'blog/:id'=>array('blog/update','',array('ext'=>'xml','method'=>'put')),

為(wèi)了(le)确保定義不(bù)沖突,REST♦↕>≤路(lù)由定義我們通(tōng)常改成下(xià) ∏♠面的(de)定義方式:

  1. array('blog/:id','blog/read','status=1',array('ext'=>'xml','method'=>'get')),
  2. array('blog/:id','blog/update','',array('ext'=>'xml','method'=>'put')),

這(zhè)樣就(jiù)可(kě)以給相(xiànδ∏g)同的(de)路(lù)由規則定義不(bù™€$λ)同的(de)參數(shù)支持。定義了(le)REST路(lù)由後,你(n↔>✔ǐ)的(de)rest方法定義就(jiù)不(bù)受任何約束,當←™→然,如(rú)果路(lù)由定義的(de)操作(zuò)方法不(b$♦<ù)存在的(de)時(shí)候,系統默認的(de)re‌‍st方法規範仍然會(huì)有(yǒu)效。