web api已經在最近幾年變成重要的話題,乙個乾淨的api設計對於後端系統是非常重要的。
通常我們為web api使用restful設計,rest概念分離了api結構和邏輯資源,通過http方法get, delete, post 和 put來操作資源。
下面是進行restful web api十個最佳實踐,能為你提供乙個良好的api設計風格。
resource
資源get
讀post
建立put
修改patch
部分修改
delete
/cars
返回 cars集合
建立新的資源
批量更新cars
批量更新cars部分內容
刪除所有cars
/cars/711
返回特定的car
該方法不允許(405)
更新乙個指定的資源
更新指定資源的部分內容
擅長指定資源
不要使用:
/getallcars
/createnewcar
/deleteallredcars
使用put, post和delete方法 而不是get方法來改變狀態,不要使用get進行狀態改變:
get /users/711?activate
get /users/711/activate
不要混淆名詞單數和複數,為了保持簡單,只對所有資源使用複數。
/cars 而不是 /car
/users 而不是 /user
/products 而不是 /product
/settings 而部署 /setting
如果乙個資源與另外乙個資源有關係,使用子資源:
get /cars/711/drivers/ 返回 car 711的所有司機
get /cars/711/drivers/4 返回 car 711的4號司機
在客戶端和服務端,雙方都要知道通訊的格式,格式在http-header中指定
content-type 定義請求格式
accept 定義系列可接受的響應格式
hypermediaastheengineofapplicationstate 超**作為應用狀態的引擎,超文字鏈結可以建立更好的文字瀏覽:
"id": 711,
"manufacturer": "bmw",
"model": "x5",
"seats": 5,
"drivers": [
"id": "23",
"name": "stefan jauker",
"links": [
"rel": "self",
"href": "/api/v1/drivers/23"
注意href指向下乙個url
filtering過濾:
使用唯一的查詢引數進行過濾:
get /cars?color=red 返回紅色的cars
get /cars?seats<=2 返回小於兩座位的cars集合
sorting排序:
允許針對多個字段排序
get /cars?sort=-manufactorer,+model
這是返回根據生產者降序和模型公升序排列的car集合
field selection
移動端能夠顯示其中一些字段,它們其實不需要乙個資源的所有字段,給api消費者乙個選擇欄位的能力,這會降低網路流量,提高api可用性。
get /cars?fields=manufacturer,model,id,color
paging分頁
使用 limit 和offset.實現分頁,預設limit=20 和offset=0;
get /cars?offset=10&limit=5
為了將總數發給客戶端,使用訂製的http頭: x-total-count.
link: ; rel="next",
; rel="last",
; rel="first",
; rel="prev",
使得api版本變得強制性,不要發布無版本的api,使用簡單數字,避免小數點如2.5.
一般在url後面使用?v
/blog/api/v1
如果你的api沒有錯誤處理是很難的,只是返回500和出錯堆疊不一定有用
http狀態碼提供70個出錯,我們只要使用10個左右:
200 – ok – 一切正常
201 – ok – 新的資源已經成功建立
204 – ok – 資源已經成功擅長
304 – not modified – 客戶端使用快取資料
400 – bad request – 請求無效,需要附加細節解釋如 "json無效"
401 – unauthorized – 請求需要使用者驗證
403 – forbidden – 伺服器已經理解了請求,但是拒絕服務或這種請求的訪問是不允許的。
404 – not found – 沒有發現該資源
422 – unprocessable entity – 只有伺服器不能處理實體時使用,比如影象不能被格式化,或者重要字段丟失。
500 – internal server error – api開發者應該避免這種錯誤。
使用詳細的錯誤包裝錯誤:
"errors": [
"usermessage": "sorry, the requested resource does not exist",
"internalmessage": "no car found in the database",
"code": 34,
"more info": ""
一些**只支援post和get方法,為了使用這些有限方法支援restful api,需要一種辦法覆蓋http原來的方法。
使用訂製的http頭x-http-method-override來覆蓋post 方法.
**:
用python寫乙個restful API
coding utf 8 package.module python實現的圖書的乙個restful api.restful api 一般模式 get select 從伺服器取出資源 一項或多項 post create 在伺服器新建乙個資源。put update 在伺服器更新資源 客戶端提供改變後的完...
10個有關於Google的有意思的事情
我想大部分人都已經知道 google 最開始是2個史丹福大學的 ph.d.學生 larry page 和 sergeybrin 的研究課題。但你可否知道 google 最初的儲存裝置其實只是乙個樂高玩具積木所拼搭起來的機器?或者 google正式成立之前,就已經有人簽了一張 10萬美金的支票送給這兩...
乙個Restful Api的訪問控制方法
分類 演算法研究 最近在做的兩個專案,都需要使用restful api,介面的安全性和訪問控制便成為乙個問題,看了一下別家的api訪問控制辦法。1 api請求 url 的後面加上乙個accesstoken 2 http頭裡面加乙個欄位accesstoken 1 為每個應用頒發乙個賬號 user 和密...