什麼是RESTful風格的API設計?

隨着移動互聯網的興起,RESTful風格的API設計也隨之流行起來,但咱們說了那麼多RESTful設計,它究竟是什麼?本篇文章帶你們來了解一下它的真實面目。小程序

RESTful概念

首先,咱們須要明確的是RESTful,它是一個理念,是一個設計規範,而並非什麼協議等。REST,全稱Representational State Transfer,直接翻譯就是:表現層狀態轉化。而該翻譯之因此晦澀是由於缺乏了主語,準確來講應該是「Resource Representational State Transfer」。通俗來說,就是「資源在網絡中以某種表現形式進行狀態轉化」。REST概念是Roy Thomas Fielding在他2000年的博士論文中提出的,他是HTTP協議(1.0版和1.1版)的主要設計者。有了對RESTful基礎概念的瞭解,咱們分別來看看其相關概念的解釋。

資源

「資源」是RESTful中最核心的概念之一。在RESTful概念中,互聯網中的每同樣信息均可以定義爲資源,好比文本、圖片、音頻、視頻等。而這些資源又均可以對應一個特定的URI(統一資源定位符),URI爲每個資源的地址或獨一無二的識別符。微信小程序

表現層

針對上面的「資源」,咱們要進行相應的呈現,並且能夠採用多種的呈現形式,而這些呈現形式就叫作「表現層」。服務器

就拿文本爲例,咱們能夠呈現爲JSON格式、XML格式、HTML格式,甚至二進制格式等。這就是表現層所作的事情。微信

狀態轉化

資源一般放在服務器端,而客戶端對服務器資源的增、刪、改、查等操做,便涉及到資源狀態的轉化。這個過程即是「 狀態轉化」。網絡

咱們以HTTP協議爲例(RESTful不只僅適用HTTP協議,只不過常常以HTTP協議爲陪襯),客戶端可經過一些操做讓服務器端的資源發生變化。app

而這整個過程,即是「表現層狀態轉化」。ide

在HTTP中,提供了四種常見的操做方式:GET、POST、PUT、DELETE。post

這四種操做方式分別對應四種基本操做:GET用來獲取資源,POST用來新建資源(也能夠用於更新資源),PUT用來更新資源,DELETE用來刪除資源。ui

爲何要使用RESTful風格呢

這是由於RESTful風格的設計擁有如下特色:結構清晰、符合標準、易於理解、擴展方便。spa

試想一下,若是採用傳統的JSP模式,頁面內容和代碼混合在一塊兒,而此時項目功能需新增移動端、微信小程序等其餘客戶端,是否須要從新定義接口?

而採用RESTful的定義,不只結構清晰,更重要的是易於擴展、適用性更普遍。

RESTful風格示例

以用戶(User)的增刪改查爲例,咱們能夠設計出一下接口形式:每列分別對應,(請求類型:請求地址:功能描述)

  • get :/user/list :獲取全部用戶信息
  • post:/user:建立用戶信息
  • put:/user:更新用戶信息
  • get:/user/1:獲取資源標識(id)爲1的用戶信息
  • delete:/user/1:刪除資源標識(id)爲1的用戶信息

看起來是否是簡潔、清晰、方便不少?

若是再和SpringBoot結合起來,那就更加方便。下面展現部分經過SpringBoot來實現Controller層的代碼。

 

@RestController@RequestMapping("/user")public class RestfulController {
@Resource private UserService userService;
/** * 建立用戶操做 */ @PostMapping public User addUser(User user) { return userService.addUser(user); }
/** * 獲取所需用戶操做 */ @GetMapping("/list") public List<User> listUser() { return userService.findAll(); }
/** * 更新用戶 */ @PutMapping public User update(User user) { return userService.update(user); }
/** * 修改用戶名 */ @PatchMapping public User updateUsername(User user) { return userService.updateUsername(user); }
/** * 獲取用戶 */ @GetMapping("{id}") public User get(@PathVariable("id") Long id) { return userService.findById(id); }
/** * 刪除用戶 */ @DeleteMapping("{id}") public void delete(@PathVariable("id") Long id) { userService.delete(id); }}
相關文章
相關標籤/搜索