任何對外提供服務的應用都繞不開API
的發佈,你的API
多是這個樣子:php
www.baidu.com/api/v1/getUsername?id=1 或者 www.baidu.com/app/index.php?r=info/user/getUsername&id=1
若是答案是YES
,那麼用句很潮的話,咱們能夠說你的API
很不RESTful
。html
API
風格首先要說,無論你的API
屬於哪一種風格,只要可以知足工做須要,就足夠了。API
格式並不存在絕對的標準,只存在不一樣的設計風格。api
API
設計包含兩部分:請求和響應。
請求包含:請求URL
、請求方法、請求頭部信息等。
響應包含:響應體和響應頭部信息。瀏覽器
一個請求URL
的組成:安全
https://www.baidu.com:443/app/index.php?r=info/user/getUsername&id=1#tag # 請求方法:GET # 請求協議:protocal: https # 請求端口:port: 443 # 請求域名:host: www.baidu.com # 請求路徑:pathname: /app/index.php # 查詢字符串:search: r=info/user/getUsername&id=1 # 頁面書籤:hash: #tag
根據URL
組成部分:請求方法、請求路徑和查詢字符串,咱們有幾種常見的API
風格。好比當刪除id=1
的做者編寫的類別爲2
的全部文章時:restful
# 純請求路徑 GET www.baidu.com/articles/delete/authors/1/categories/2 # 一級使用路徑,二級之後使用查詢字符串 GET www.baidu.com/articles/delete/author/1?category=2 # 純查詢字符串 GET www.baidu.com/deleteArticles?author=1&category=2 # RESTful風格 DELETE www.baidu.com/articles?author=1&category=2
前面三種都是GET
請求,主要的區別在於多個查詢條件時怎麼傳遞查詢字符串,有的經過使用解析路徑,有的經過解析傳參,有的二者混用。同時在描述API
功能時,可使用article/delete
,也可使用deleteArticles
。網絡
而第四種RESTful API
最大的區別在於行爲動詞DELETE
的位置,不在url
裏,而在請求方法中。架構
RESTful
設計風格REST(Representational State Transfer 表現層狀態轉移)
是一種軟件架構風格、設計風格,而不是標準。主要用於客戶端和服務端的API
交互,它的優點在於更簡潔、清晰、可讀性強。app
REST
的主要特色是:url
URI(Universal Resource Identifier 通用資源標識)
來表示,經過請求方法來指明操做類型:GET/POST/PUT/DELETE
。無狀態是最重要的特性,大部分的Client-Server,Brower-Server
也都能很好的支持。第2
點則是咱們須要去關注的。
REST URL
表現層狀態轉移(REST)
是一個大的概念,也很差理解,個人理解就是在URL
的定義上可以清楚的表示其請求含義。它的核心思路就是動詞+賓語:
DELETE www.baidu.com/api/v1/articles?author=1&category=2 # 動詞 DELETE,表示要進行的操做是刪除,即狀態轉移 # 賓語 articles,表示文章這種資源URI,推薦用複數,即表現層 # 定語 author=1&category=2,表示具體是什麼資源 # 版本 api/v1,這個可以幫助咱們更好的進行版本的升級,同時不影響原有的請求
咱們用articles
來指明資源類型,用author=1&category=2
來在肯定具體的資源,用GET/POST/PUT/DELETE
來指明要進行的增刪改查操做。
這種風格相比於/api/deleteArticles
,聲明的方法數量只有1/4
,各個接口之間的風格也更加統一,調用起來更加清晰。
同時這種方法可以保證瀏覽器常規能訪問的到的GET
請求對資源來講是安全的。好比別人給咱們發送了一個連接:/deleteArticle?id=1
,咱們絕對不會但願隨便點擊一下就會跳轉到瀏覽器訪問,而後誤刪了這個資源。
除了請求URL
有要求,在響應時也有一些要求。咱們知道狀態碼有:
1xx:
請求相關信息2xx:
操做成功3xx:
重定向4xx:
客戶端錯誤5xx:
服務端錯誤全部的狀態碼 共有100
多種,涵蓋了絕大多數常見的網絡場景,並且是網絡通用的定義規範和解釋,所以咱們應該儘量使用精確的狀態碼。
當前有一些不太恰當的作法是即使請求出錯,依然使用200
狀態碼,轉而將錯誤信息包含在響應體中,或者響應使用純文本致使沒法和正常數據同樣標準化解析,如:
httpCode: 200 response: { status: 1, msg: '請求無權限' } # 或: httpCode: 200 response: '請求無權限'
但咱們其實能夠用更精確的狀態碼403
表明權限不足,因此合適的響應結果應該是:
# 異常時 httpCode: 403, httpErrorMsg: '請求無權限' # 正常時: httpCode: 200, response: { status: 0, msg: '', data: [] }
RESTful
是一種API
設計風格,並非一種強制規範和標準,它的特色在於請求和響應都簡潔清晰,可讀性強。
咱們主要關注幾點:
URL = 動做(GET/POST/PUT/DELETE)+ 資源
JSON
格式數據