如何設計一個優雅的RESTFUL的介面
show me the code and talk to me,做的出來更要說的明白
我是布林bl,你的支援是我分享的動力!
一 、引入
設計介面是我們開發人員的日常操作。當我們把介面交給前端人員時,是否有種拔劍出鞘的錯覺。畢竟交付介面,我們的開發工作就階段性完成了。不過,如果我們沒有一個介面設計規範的時候,結果會怎樣呢?我們來張圖感受一下。
二、REST
2000年,一個年輕小夥子(Roy Thomas Fielding)在他的博士論文提出了 REST。REST 是一種全球資訊網軟體架構風格。為什麼說是風格不是標準呢?個人理解可能說標準就有點過分了。小夥子做不到。隨後這種風格被推廣開來,漂洋過海,被大眾熟知。在 REST 的基礎上,產生了 RESTFUL 。什麼是 RESTFUL?簡單的說,符合 REST 風格的介面就是 RESTFUL。
三、RESTFUL
介面各種各樣。正如一千個人眼裡有一千個魯迅。RESTFUL 介面究竟長什麼樣子呢?
3.1 HTTP 的方法
HTTP 裡面有幾個基本的方法。我們利用這些約定一些規範。
方法 | 作用 |
---|---|
GET | 獲取資料 |
POST | 插入資料 |
PUT | 更新資料 |
DELECT | 刪除資料 |
從表中,如果我們可以清楚看到當我們的介面是關於獲取資料,那麼我們使用 GET 方法。
如果我們可以清楚看到當我們的介面是關於插入資料,那麼我們使用 POST 方法。
如果我們可以清楚看到當我們的介面是關於更新資料,那麼我們使用 PUT 方法。
如果我們可以清楚看到當我們的介面是關於刪除資料,那麼我們使用 DELECT 方法。
3.2 名詞
在上面我們已經知道介面在什麼時候需要什麼方法,那麼我們現在來進入到設計介面的第二步。
我們看看線上網站的介面是怎麼樣的。
圖中我們可以看到有個 v1 ,他代表的是版本號,所以我們在設計介面的時候可以在將版本號寫上,用 v1、v2、v3 等表示。
我們發現他的介面都是名詞。所以我們知道 RESTFUL 介面使用的是名詞。比如我們設計一個獲取資料的介面,我們可這樣設計
/v1/list
上面介面是獲取所有資料。
當我們需要列表中的一條資料,我們可以這樣設計
/v1/list/1
上面介面表示獲取是列表的1號資料,我們可以獲取2號、3號資料等等,只要改變數字即可。
3.3 組合
結合上面兩步,我們就可以設計出增刪改查的 restful 介面了。
介面 | 方法 | 作用 |
---|---|---|
/v1/list | GET | 獲取列表 |
/v1/list | POST | 增加列表 |
/v1/list | PUT | 更新列表 |
/v1/list | DELECT | 刪除列表 |
3.4 應用
以下是原始碼的demo
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
@Slf4j
public class LsbRestfulApplication {
public static void main(String[] args) {
SpringApplication.run(LsbRestfulApplication.class, args);
}
/**
* 得到所有列表
* @return
*/
@RequestMapping(value = "/v1/list",method = RequestMethod.GET)
public String getList(){
log.info("得到列表");
return "得到列表";
}
/**
* 得到列表中的一條
* @param name
* @return
*/
@RequestMapping(value = "/v1/list/{name}",method = RequestMethod.GET)
public String getListone(@PathVariable("name") String name){
log.info("得到列表"+name);
return "得到列表"+name;
}
/**
* 往列表中的增加一條資料
* @return
*/
@RequestMapping(value = "/v1/list",method = RequestMethod.POST)
public String addList(){
log.info("增加一個列表1");
return "增加一個列表1";
}
/**
* 更新列表中的一條資料
* @return
*/
@RequestMapping(value = "/v1/list/{name}",method = RequestMethod.PUT)
public String updateListOne(@PathVariable("name") String name){
log.info("更新列表"+name);
return "更新列表"+name;
}
/**
* 刪除所有列表
* @return
*/
@RequestMapping(value = "/v1/list",method = RequestMethod.DELETE)
public String delList(){
log.info("刪除一個列表");
return "刪除一個列表";
}
}
四、某同城交友網站
https://github.com/buerbl
暗號:荊軻刺秦王