RESTful 架構,就是目前最流行的一種互聯網軟件架構。它結構清晰、符合標準、易於理解、擴展方便,所以正得到越來越多網站的採用。
1.什麼是 RESTful 架構
1.1 REST名詞解釋
REST -- REpresentational State Transfer
首先,之所以晦澀是因爲前面主語被去掉了,全稱是 Resource Representational State Transfer:
- Resource:資源,即數據。每種資源對應一個特定的URI。
- Representational:資源的表現形式,比如用JSON,XML,JPEG等。
- State Transfer:狀態變化。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。通過HTTP動詞實現(GET、POST、PUT、DELETE)。
綜合上面的解釋,我們總結一下什麼是RESTful架構:
- 每一個 URI 代表一種資源;
- 客戶端和服務器之間,傳遞這種資源的某種表現層;
- 客戶端通過四個 HTTP 動詞,對服務器端資源進行操作,實現"表現層狀態轉化"。
1.2 RESTful 設計誤區
- 在 URI 包含動詞
因爲"資源"表示一種實體,所以應該是名詞,URI不應該有動詞,動詞應該放在HTTP協議中。例如:
POST api/user/get/{id} //錯誤 URI,其中get是動詞,這個URI就設計錯了
GET api/user/{id} //正確 URI
POST api/deleteUser/{id} //錯誤 URI,其中delete是動詞,這個URI就設計錯了
DELETE api/user/{id} //正確 URI
如果某些動作是HTTP動詞表示不了的,你就應該把動作做成一種資源。比如網上匯款,從賬戶1向賬戶2匯款500元:
POST /accounts/1/transfer/500/to/2 //錯誤 URI
/**正確的寫法是把動詞transfer改成名詞transaction,資源不能是動詞,但是可以是 一種服務:**/
POST /transaction HTTP/1.1
Host: 127.0.0.1
from=1&to=2&amount=500.00
- 在 URI 中加入版本號
因爲不同的版本,可以理解成同一種資源的不同表現形式,所以應該採用同一個URI。版本號可以在HTTP請求頭信息的Accept字段中進行區分。例如:
http://www.example.com/app/1.0/foo //錯誤 URI
http://www.example.com/app/1.1/foo //錯誤 URI
Accept: vnd.example-com.foo+json; version=1.0 //正確
Accept: vnd.example-com.foo+json; version=1.1 //正確
2.爲什麼使用 RESTful 架構
RESTful 架構,就是目前最流行的一種互聯網軟件架構。它結構清晰、符合標準、易於理解、擴展方便,所以正得到越來越多網站的採用。
- RESTful架構完全基於HTTP協議,充分利用HTTP協議的特點,通過統一接口,使用GET、POST、PUT、DELETE等HTTP動詞來區分獲取、新增、更新和刪除等不同操作。
- 面向資源,一目瞭然,具有自解釋性。在RESTful架構中一切都是資源,用戶通過URL訪問網站就是請求網站服務器上的資源。每一個URI標示了一個唯一的資源。
- 數據描述簡單,一般以XML,JSON做數據交換(現在主要使用JSON)。
3.如何使用 RESTful 架構
使用 RESTful 實現增刪改查接口:
@RestController
@RequestMapping("/api/user")
public class UserController {
// 增加操作 POST api/user/
@RequestMapping(value = "/" , method = RequestMethod.POST)
public Result add(@RequestBody User user){
//...具體接口實現
}
// 刪除操作 DELETE api/user/{id}
@RequestMapping(value = "/{id}" , method = RequestMethod.DELETE)
public Result delete(@PathVariable String id){
//...具體接口實現
}
// 更新操作 PUT api/user/{id}
@RequestMapping(value = "/{id}" , method = RequestMethod.PUT)
public Result update(@PathVariable String id , @RequestBody User user){
//...具體接口實現
}
// 查詢操作 GET api/user/{id}
@RequestMapping(value = "/{id}" , method = RequestMethod.GET)
public Result query(@PathVariable String id){
//...具體接口實現
}
// 查詢列表操作 GET api/user/list
@RequestMapping(value = "/list" , method = RequestMethod.GET)
public Result list(){
//...具體接口實現
}
}
在 Spring Boot 構建 RESTful 風格應用,你學會了嗎?