Django RESTful規範
Restful :
web服務互動:
我們在瀏覽器中能看到的每個網站, 都是一個web服務. 那麼我們在提供每個web服務的時候, 都需要前後端互動. 前後端互動就一定有一些實現方案, 我們通常叫web服務互動方案.
目前主流的三種web服務互動方案:
REST(Representational State Transfer) 表述性狀態轉移
SOAP(Simple Object Access Protocol) 簡單的物件訪問協議
XML-RPC(XML Remote Procedure Call) 基於XML的遠端過程呼叫
XML-RPC是通過XML將呼叫函式封裝, 並使用HTTP協議作為傳送機制.
後來在新的功能不斷被引入下, 這個標準慢慢演變後才能為今日的SOAP協定.
SOAP服務則是以本身所定的操作集, 來訪問網路上的資源.
SOAP也是基於XML的,但是它不只限於HTTP協議的傳輸,包括TCP協議,UDP協議都可以傳輸。
REST是Roy Thomas Fielding博士於2000年在他的博士論文裡提出來的。
REST相比SOAP更加簡潔,效能和開發效率也有突出的優勢。
我們今天主要說一下這個REST,現在越來越多的web服務開始採用REST風格設計和實現。
例如,amazon.com提供接近REST風格的Web服務進行圖書查詢;雅虎提供的Web服務也是REST風格的。
我們接下來要學的框架也是遵循REST風格的,那麼我們來看下它到底是個什麼樣的風格,
瞭解了它是什麼後,我們看下它的優點是什麼,我們為什麼用它。
理解REST :
如果我們想要理解restful, 就要理解Representational State Transfer這個片語的意思: 表徵性狀態轉移.
所謂的表徵性, 其實指的就是資源. 通常稱為資源狀態轉移.
什麼是資源:
任何事物, 只要有被引用的必要, 它就是一個資源.
我們在瀏覽器中看到的文字, 視訊, 圖片等都是資源. 這些都是實實在在存在的實體.
資源可以是一個實體, 也可以是抽象概念.
比如說:
某個人的個人資訊
某個人的手機號
某個人和另外一個人的潛在關係.
在網路中, 我們要引用資源, 資源一定要有一個標識, 在web中的唯一標識就是URI.
什麼是URI, URL:
URI 統一資源識別符號
URL 統一資源定位符
URI是給我們的資源進行標識的, URL是描述我們資源地址的.
比如每個人都有名字和身份證, 名字可以重複, 但是身份證號是唯一的.
那麼身份證號就相當於我們的URI, 標識我們每一個人, 也可以說標識我們每一個資源.
我們可以通過身份證號確定一個人, 但是想要找到這個人的具體位置就要通過具體的定位方式.
這個就是我們的URL, 我們通過這兩種方式都可以找到我們的資源,
其實URL可以說是URI的子集, 通過定位的方式實現的URI.
統一資源介面:
現在我們可以通過URL去訪問到資源, 那麼我們隊資源會有很多不同的操作, 增刪查改
以前我們可能會為了這個增加一個URL, 然後這個URL就是對資料進行增加的,
還會為了更新和刪除分別設計一個URL, 現在不需要了, 只有一個URL,
然後根據HTTP請求方式的不同, 對資源進行不同的操作, 這個就是統一資源介面.
資源的表述:
資源的表述其實就是資源的展現形式, 我們客戶端和服務端傳輸的都是資源的表述, 而不是資源本身.
例如文字資源可以採用html, xml, json等格式, 圖片可以使用PNG或JPG展現出來.
那麼客戶端是怎麼知道服務端提供哪種表述形式的呢?
可以通過HTTP內容協商, 客戶端可以通過Accept頭請求一種特定格式的表述, 服務端通過Content-Type告訴客戶端資源的表述形式.
這些資源的表述呈現在頁面上, 就是我們說的資源狀態.
狀態轉移:
我們在看頁面的時候,從當前資源的表述(也可以說狀態或者表現層)會跳轉到其他的資源狀態。
服務端通過超媒體告訴客戶端當前狀態有哪些後續狀態可以進入。
這些類似"下一頁"之類的連結起的就是這種推進狀態的作用——指引你如何從當前狀態進入下一個可能的狀態。
總結:
可以得知REST風格的特點如下:
(1)在web中,只要有被引用的必要都叫資源。
(2)每個URI代表一個資源,獨一無二的。
(3)客戶端通過HTTP的方法,對伺服器端資源進行操作;
(4)客戶端和伺服器之間,傳遞這種資源的某種表現層;
(5)通過超連結的指引,實現"表現層狀態轉移"。
RESTful :
如果一個架構符合REST的約束條件和原則, 我們就稱它為RESTful架構.
一種軟體的架構風格, 設計風格, 為客戶端和服務端的互動提供一組設計原則和約束條件.
restful規範 :
1. 面向資源程式設計:
每一URL代表一種資源, URL中儘量不要用動詞, 多用名詞
2. 根據method不同, 進行不同的操作:
GET/POST/PUT/DELETE/PATCH
3. 在URL中體現版本:
https://www.bootcss.com/v1/mycss
https://v1.bootcss.com/mycss
4. 在URL中體現是否是API:
https://www.bootcss.com/api/mycss
https://api.bootcss.com/mycss
5. 在URL中guolv條件
https://www.bootcss.com/v1/mycss?page=3
6. 儘量使用HTTPS:
https://www.bootcss.com/v1/mycss
7. 響應時設定狀態碼:
1. 資訊, 伺服器收到請求, 需要請求者繼續執行操作
2. 成功, 操作被成功接收並處理
3. 重定向, 需要進一步的操作以完成請求
4. 客戶端錯誤, 請求包含語法錯誤或無法完成請求
5. 伺服器錯誤, 伺服器在處理請求的過程中發生了錯誤
8. 返回值:
GET請求: 返回查到所有或單條資料
POST請求: 返回新增的資料
PUT請求: 返回更新的資料
PATCH請求: 區域性更新, 返回更新的整條資料
DELETE請求: 返回值為空
9. 返回錯誤資訊:
返回值攜帶錯誤資訊
10. Hypermedia API
如果遇到需要跳轉的情況 攜帶跳轉介面的URL
ret = { code: 1000, data:{ id:1, name:'小強', depart_id:http://www.baidu.com/api/v1/depart/8/ } }