在 Spring Boot 構建 RESTful 風格應用

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架構:

  1. 每一個 URI 代表一種資源;
  2. 客戶端和服務器之間,傳遞這種資源的某種表現層;
  3. 客戶端通過四個 HTTP 動詞,對服務器端資源進行操作,實現"表現層狀態轉化"。

1.2 RESTful 設計誤區

  1. 在 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
  1. 在 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 架構,就是目前最流行的一種互聯網軟件架構。它結構清晰、符合標準、易於理解、擴展方便,所以正得到越來越多網站的採用。

  1. RESTful架構完全基於HTTP協議,充分利用HTTP協議的特點,通過統一接口,使用GET、POST、PUT、DELETE等HTTP動詞來區分獲取、新增、更新和刪除等不同操作。
  2. 面向資源,一目瞭然,具有自解釋性。在RESTful架構中一切都是資源,用戶通過URL訪問網站就是請求網站服務器上的資源。每一個URI標示了一個唯一的資源。
  3. 數據描述簡單,一般以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 風格應用,你學會了嗎?

參考文檔:理解RESTful架構——阮一峯的網絡日誌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章