前后端的通信方式 REST
- 1.初識 REST
- 1.1 什么是 REST
- 1.2 REST 的特征
- 2.HTTP 方法與 CRUD 動作映射
- 3.實現 REST 風格的 CRUD
1.初識 REST
1.1 什么是 REST
REST 是軟件架構的規范體系結構,它將 資源的狀態 以適合客戶端的形式從服務器端發送到客戶端(或相反方向)。在 REST 中,通過 URL 進行資源定位,用 HTTP 動作(GET
、POST
、DELETE
、PUSH
等)描述操作,完成功能。
🚀 REST 即 表述性狀態傳遞(Representational State Transfer,簡稱 REST)是 Roy Fielding 博士在 2000 年他的博士論文中提出來的一種 軟件架構風格(Software Architecture Style)。它是一種針對網絡應用的設計和開發方式,可以降低開發的復雜性,提高系統的可伸縮性。
🚀 REST 密切相關的兩個名詞:資源 和 狀態。可以說,資源 是 REST 系統的核心概念。所有的設計都會以資源為中心,包括如何對資源進行添加,更新,查找以及修改等。而資源本身則擁有一系列狀態。在每次對資源進行添加 ,刪除或修改的時候,資源就將從一個狀態轉移到另外一個狀態。
遵循 RESTful 風格,可以使開發的接口通用。以便調用者理解接口的作用。基于 REST 構建的 API 就是 RESTful(REST 風格)API。
各大機構提供的 API 基本都是 RESTful 風格的,這樣可以統一規范,減少溝通、學習和開發的成本。
1.2 REST 的特征
- 客戶 — 服務器(
client-server
):提供服務的服務器和使用服務的客戶端需要被隔離對待。 - 無狀態(
stateless
):服務器端不存儲客戶的請求中的信息,客戶的每一個請求必須包含服務器處理該請求所需的所有信息,所有的資源都可以通過 URI 定位,而且這個定位與其他資源無關,也不會因為其他資源的變化而變化。
Restful 是典型的基于 HTTP 的協議。HTTP 連接最顯著的特點是:客戶端發送的每次請求都需要服務器回送響應;在請求結束后,主動釋放連接。從建立連接到關閉連接的過程稱為 “一次連接”,前后的請求沒有必然的聯系,所以是無狀態的。
- 可緩存(
cachable
):服務器必須讓客戶知道請求是否可以被緩存。 - 分層系統(
layered System
) :服務器和客戶之間的通信必須被標準化。 - 統一接口(
uniform interface
):客戶和服務器之間通信的方法必須統一,RESTful 風格的數據元操作 CRUD(create
、read
、update
、delete
)分別對應 HTTP 方法:GET 用來 獲取資源,POST 用來 新建資源,PUT 用來 更新資源,DELETE 用來 刪除資源,這樣就統一了數據操作的接口。 - HTTP 狀態碼:狀態碼在 REST 中都有特定的意義:
200
、201
、202
、204
、400
、401
、403
、500
。比如,401
表示用戶身份認證失敗;403
表示驗證身份通過了,但資源沒有權限進行操作。 - 支持按需代碼(
Code-On-Demand
,可選):服務器可以提供一些代碼或腳本,并在客戶的運行環境中執行。
2.HTTP 方法與 CRUD 動作映射
RESTful 風格使用同一個 URL,通過約定不同的 HTTP 方法來實施不同的業務。
普通網頁的 CRUD 和 RESTful 風格的 CRUD 的區別,見表:
動作 | 普通 CRUD 的 URL | 普通 CRUD 的 HTTP 方法 | Restful 的 URL | Restful 的 CRUD 的 HTTP 方法 |
---|---|---|---|---|
查詢 | Article/id=1 | GET | Article/{id} | GET |
添加 | Article?title=xxx&body=xxx | GET / POST | Article | POST |
修改 | Article/update?id=xxx | GET | Article/{id} | PUT 或 PATCH |
刪除 | Article/delete?id=xxx | GET | Article/{id} | DELETE |
可以看出,RESTful 風格的 CRUD 比傳統的 CRUD 簡單明了,它通過 HTTP 方法來區分增加、修改、刪除和查詢。
3.實現 REST 風格的 CRUD
在 Spring Boot 中,如果要返回 JSON 數據,則只需要在控制器中用 @RestController
注解。 如果提交 HTTP 方法,則使用注解 @RequestMapping
來實現,它有以下兩個屬性:
Value
:用來制定 URI。Method
:用來制定 HTTP 請求方法。
(1)獲取列表采用的是 GET 方式,返回 List。例如,下面代碼返回 Article 的 List。
@RequestMapping(value = "/", method = RequestMethod.GET)
public List<Article> getArticleList() {List<Article> list = new ArrayList<Article>(articleRepository.findAll());return list;
}
(2)增加內容(提交內容)采用的是 POST 方式,一般返回 String 類型或 int 類型的數據,見以下代碼:
@RequestMapping(value = "/", method = RequestMethod.POST)
public String add(Article article) {articleRepository.save(article);return "success";
}
(3)刪除內容,必須采用 DEIETE 方法。一般都是根據 id 主鍵進行刪除的。
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") long id) {articleRepository.deleteByld(id);return "success";
}
(4)修改內容,則用 PUT 方法。
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public String update(Article model) {articleRepository.save(model);return "success";
}
(5)查詢內容,和上面獲取列表的方法一樣,也是采用 GET 方法。
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Article findArticle(@PathVariable("id") Integer id) {Article article = articleRepository.findByld(id);return article;
}
對于 RESTful 風格的增加、刪除、修改和查詢,可以編寫測試單元,也可以用 Postman 測試,分別用 GET、POST、PUT、DELETE 方法提交測試。雖然這樣實現了 RESTful 風格,但還有一個問題 —— 返回的數據并不統一,在實際生產環境中還需要進行改進,所以需要設計統一的 RESTful 風格的數據接口。