restful風格
概念
restful一種軟件架構、設計風格、而不是標准,只是提供了一組設計原則和約束條件
它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件更簡潔,更有層冊,更易於實現緩存等機制。
請求方式
可以通過 GET、 POST、 PUT、 PATCH、 DELETE 等方式對服務端的資源進行操作。其中,GET 用於查詢資源,POST 用於創建資源,PUT 用於更新服務端的資源的全部信息,PATCH 用於更新服務端的資源的部分信息,DELETE 用於刪除服務端的資源。
這里使用“用戶”的案例進行回顧通過 GET、 POST、 PUT、 PATCH、 DELETE 等方式對服務端的資源進行操作。
@GetMapping select操作(讀)
@PostMapping create操作(新增)
@PutMapping。 update操作(修改)
@DeleteMapping delete操作(刪除)
使用RESTful操作資源
【GET】 /users # 查詢用戶信息列表
【GET】 /users/1001 # 查看某個用戶信息
【POST】 /users # 新建用戶信息
【PUT】 /users/1001 # 更新用戶信息(全部字段)
【PATCH】 /users/1001 # 更新用戶信息(部分字段)
【DELETE】 /users/1001 # 刪除用戶信息
之前的操作是沒有問題的,大神認為是有問題的,有什么問題呢?你每次請求的接口或者地址,都在做描述,例如查詢的時候用了queryUser,新增的時候用了saveUser ,修改的時候用了updateUser,其實完全沒有這個必要,我使用了get請求,就是查詢.使用post請求,就是新增的請求,PUT就是修改,delete就是刪除,我的意圖很明顯,完全沒有必要做描述,這就是為什么有了restful.
API設計風格基本規則
1.使用名詞而不是動詞
不要使用:
/getAllUsers
/createNewUser
/deleteAllUser
2.Get方法和查詢參數不應該涉及狀態改變
使用PUT, POST 和DELETE 方法 而不是 GET 方法來改變狀態,不要使用GET 進行狀態改變:
3.使用復數名詞
不要混淆名詞單數和復數,為了保持簡單,只對所有資源使用復數。
/cars 而不是 /car
/users 而不是 /user
/products 而不是 /product
/settings 而部署 /setting
- 使用子資源表達關系
如果一個資源與另外一個資源有關系,使用子資源:
GET /cars/711/drivers/ 返回 car 711的所有司機
GET /cars/711/drivers/4 返回 car 711的4號司機
5.使用Http頭聲明序列化格式
在客戶端和服務端,雙方都要知道通訊的格式,格式在HTTP-Header中指定
Content-Type 定義請求格式
Accept 定義系列可接受的響應格式
6.為集合提供過濾 排序 選擇和分頁等功能
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.
鏈接到下一頁或上一頁可以在HTTP頭的link規定,遵循Link規定:
Link: https://blog.mwaysolutions.com/sample/api/v1/cars?offset=15&limit=5; rel="next",
https://blog.mwaysolutions.com/sample/api/v1/cars?offset=50&limit=3; rel="last",
https://blog.mwaysolutions.com/sample/api/v1/cars?offset=0&limit=5; rel="first",
https://blog.mwaysolutions.com/sample/api/v1/cars?offset=5&limit=5; rel="prev",
7.版本化你的API
使得API版本變得強制性,不要發布無版本的API,使用簡單數字,避免小數點如2.5.
一般在Url后面使用?v
/blog/api/v1
- 使用Http狀態碼處理錯誤
如果你的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": "http://dev.mwaysolutions.com/blog/api/v1/errors/12345"
}
]
}
9.允許覆蓋http方法
一些代理只支持POST 和 GET方法, 為了使用這些有限方法支持RESTful API,需要一種辦法覆蓋http原來的方法。
使用訂制的HTTP頭 X-HTTP-Method-Override 來覆蓋POST 方法.
Restful風格的springMVC配搭ajax請求的例子
例子