REST介紹
REST(Representational State Transfer表述性狀態轉移)是一種針對網絡應用的設計和開發方式,可以降低開發的復雜性,提高系統的可伸縮性。REST提出了一些設計概念和准則:
1、網絡上的所有事物都被抽象為資源(resource);
2、每個資源對應一個唯一的資源標識(resource identifier);
3、通過通用的連接器接口(generic connector interface)對資源進行操作;
4、對資源的各種操作不會改變資源標識;
5、所有的操作都是無狀態的(stateless)。
需要注意的是,REST是設計風格而不是標准。REST通常基於使用HTTP,URI,和XML以及HTML這些現有的廣泛流行的協議和標准。
傳統的請求模式和REST模式的請求模式區別:
作用 | 傳統模式 | 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/REST
RESTFul支持
3.2的RESTFul支持更為靈活,你只需要把控制器繼承Think\Controller\RestController即可。 繼承RestController控制器后你的訪問控制器就可以支持下面的一些功能:
- 支持資源類型自動檢測;
- 支持請求類型自動檢測;
- RESTFul方法支持;
- 可以設置允許的請求類型列表;
- 可以設置允許請求和輸出的資源類型;
- 可以設置默認請求類型和默認資源類型;
REST參數
繼承了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',) 一.首先,什么是REST?
REST從字面上講叫做Representational State Transfer,翻譯成表現層狀態轉移,但是一般在翻譯的時候,前面會加一個Resource,即Resource Representational State Transfer,即為資源表現層狀態轉移.用人話講就是:客戶端通過HTTP請求,對服務器端的資源進行操作,實現"表現層(使用HTTP動詞去促使服務器端資源的)狀態發生改變".二. 什么是RESTful?
RESTful是代表REST化,或者說設計遵從REST架構的,所以要了解RESTful就需要了解REST.三.我們為什么要使用RESTful的風格來開發接口?
先從傳統設計接口的方式來看:
新增一個員工:http://www.demo.cn/finance/employee/createEmp
刪除一個員工:http://www.demo.cn/finance/employee/deleteEmp
修改一個員工:http://www.demo.cn/finance/employee/updateEmp
獲取員工列表:http://www.demo.cn/finance/employee/listEmp
現在我們發現:一個非常簡單的需求產生的問題:
1.每一個操作,都需要一個獨立的url去操作,因為我們對員工的動作都需要反映在url里面.
2.會產生大量的url,非常不方便接口的維護和文檔的維護
3.如果有不同的響應方式,我們可能需要額外的參數,甚至不同的url來描述
4.請求參數包含在請求地址中,無法針對性做緩存
如果我們使用RESTful風格的接口,那么我們可以如下做:
新增一個員工:POST http://www.demo.cn/finance/employee
刪除一個員工:DELETE http://www.demo.cn/finance/employee
修改一個員工:PATCH http://www.demo.cn/finance/employee
獲取員工列表:GET http://www.demo.cn/finance/employee
可以發現,我們通過HTTP的請求方式來給予這些請求的不同含義,動作設計和示例如下:
下面是一個簡單的實踐,我們可以使用去哪兒網開源的YApi來幫助我們管理接口並測試: