寫一個restful后臺你需要什么
基礎知識
- HTTP 協議
- oauth2 協議
- 一定的數據庫設計使用能力
- json
協議設計
作為后臺服務,需要一個比較符合程序員直覺的設計感覺,最基本幾個要求:
- url應該包含版本號,方便多個版本的前臺使用
- 語義化url,url中不要包含動詞,前后url應該包含結構間應該包含明顯的包含關系
- 語義化動作,目前的情形下只需要包含get(查詢),post(新增),put(修改),delete(刪除)即可
- 輸入和輸出采用json
- 使用http state code 表示結果狀態
url設計
- 包含版本號,方便迭代,多個版本api同時使用
- url中的名詞需要注意單復數形式,對單個資源的操作用單數,對多個資源的操作用復數
- 名詞化資源:url中的每個部分應該包含明比較明顯的從屬關系,設計上比較符合數據庫中er模型的實體,注意名詞的單復數對于ge
- 獲取用戶
get /v1/user
- 獲取所有用戶
get /v1/users
- 獲取某個用戶
get /v1/user/1
- 修改某個用戶信息
put /v1/user/1
- 獲取某個用戶的所有電話
get /v1/user/2/phone_nums
- 有時可以省去指定某個特定
/1
,作為當前用戶,返回當前用戶的電話get /v1/user/phone_nums
- 獲取用戶
語義化動作
使用http的幾個標準方法來操作資源
目前主流支持的http方法有:
-
get
獲取資源 -
post
創建資源 -
put
、patch
更新資源 -
delete
刪除資源
使用這些方法配合url定位資源基本可以完成大部分操作
實際使用過程中可能有很多請求不是這樣的動詞語義,但基本都可以映射到這幾種方法上來
鑒權Authentication
因為restful 的無狀態特點,鑒權提供了如何識別一個請求發出者
目前業界普遍使用的是oauth2.0協議,目前我們使用的是一個它的簡化版本,在http header 中增加一個字段
Access_token
作為用戶鑒權標準。
需要注意的是,為了增加安全性,這個token應該增加自動過期,然而為了體驗,目前沒有設置
輸入和輸出
輸入和輸出根據方法的不同,正確結果不同有所差異。
查詢操作
get 中可以使用查詢字符串作為輸入 比如 get
/v1/user?username=a
而查詢需要發送的參數的作用一般在于進行幾個后續操作,有分頁
,過濾
,搜索
,排序
*分頁:
目前采用的使用page參數作為頁碼進行操作
v1/users?page=1
但是新的標準中使用的是link header作為翻頁的標準,使用link header的API應該返回一系列組合好了的url而不是讓用戶自己再去拼。這點在基于游標的分頁中尤為重要。例如下面,來自github的文檔
Link: <https://api.github.com/user/repos?page=3&per_page=100>; rel="next",
<https://api.github.com/user/repos?page=50&per_page=100>; rel="last"
根據目前情況,仍然將使用一段時間page 作為分頁游標
- 過濾 ,過濾結果。目前沒有這樣的操作
- 搜索,使用
?q=asd
查詢字符傳來查詢,所有的搜索都是使用模糊搜索 - 排序,使用
?sort_by=asd
查詢字符串來進行排序
輸出,根據文檔而定,一般而言根據結果可以分為正確返回和錯誤返回
需要注意的是單復數返回結果的不一致
返回某個用戶信息 get /v1/user/2
{
"id": 1,
"username":"asd",
"phone":"132xxxx2222"
}
獲取全部用戶信息 get
/v1/users
{
"users":[
{
"id":1,
"username":"asd",
"phone":"132xxxx2222"
},
...
]
}
新增操作
post
方法使用json object 獲取傳入參數
比如創建用戶 則可以向 /v1/user
發送post
請求,請求body是json字符串
{
"username":"coco",
"password":"test"
}
post
,put
方法房返回 創建、修改的id,比如之前創建用戶的操作返回json
{
"id":123
}
更新操作
put
方法使用json object 獲取傳入參數,傳入的數據大體相當于post方法。但是這邊為了方便使用,混淆了put和patch 方法,所有put
方法的參數都是可選的,只修改發來的參數部分
刪除操作## Heading
delete
方法不接受參數,對某個資源的操作需要包含在
delete
方法返回操作結果,一般是
{
"state":"ok"
}
標準化過程
一般的restful操作基本可以分為這么幾步
其中出現了幾個錯誤,用幾個http狀態碼確定錯誤類型
所有錯誤返回體是
{ "state":"error", "code":123, "reason":"呵呵"}
下一篇將 python的tornado 框架具體實現一個這樣標準的模板~~~~
全文禁止轉載!!!!