show me the code and talk to me,作的出來更要說的明白
我是布爾bl,你的支持是我分享的動力!前端
設計接口是咱們開發人員的平常操做。當咱們把接口交給前端人員時,是否有種拔劍出鞘的錯覺。畢竟交付接口,咱們的開發工做就階段性完成了。不過,若是咱們沒有一個接口設計規範的時候,結果會怎樣呢?咱們來張圖感覺一下。java
2000年,一個年輕小夥子(Roy Thomas Fielding)在他的博士論文提出了 REST。REST 是一種萬維網軟件架構風格。爲何說是風格不是標準呢?我的理解可能說標準就有點過度了。小夥子作不到。隨後這種風格被推廣開來,漂洋過海,被大衆熟知。在 REST 的基礎上,產生了 RESTFUL 。什麼是 RESTFUL?簡單的說,符合 REST 風格的接口就是 RESTFUL。git
接口各類各樣。正如一千我的眼裏有一千個魯迅。RESTFUL 接口究竟長什麼樣子呢?github
HTTP 裏面有幾個基本的方法。咱們利用這些約定一些規範。web
方法 | 做用 |
---|---|
GET | 獲取數據 |
POST | 插入數據 |
PUT | 更新數據 |
DELETE | 刪除數據 |
從表中,若是咱們能夠清楚看到當咱們的接口是關於獲取數據,那麼咱們使用 GET 方法。
若是咱們能夠清楚看到當咱們的接口是關於插入數據,那麼咱們使用 POST 方法。
若是咱們能夠清楚看到當咱們的接口是關於更新數據,那麼咱們使用 PUT 方法。
若是咱們能夠清楚看到當咱們的接口是關於刪除數據,那麼咱們使用 DELECT 方法。spring
在上面咱們已經知道接口在何時須要什麼方法,那麼咱們如今來進入到設計接口的第二步。restful
咱們看看線上網站的接口是怎麼樣的。架構
圖中咱們能夠看到有個 v1 ,他表明的是版本號,因此咱們在設計接口的時候能夠在將版本號寫上,用 v一、v二、v3 等表示。app
咱們發現他的接口都是名詞。因此咱們知道 RESTFUL 接口使用的是名詞。好比咱們設計一個獲取數據的接口,咱們可這樣設計網站
/v1/list
複製代碼
上面接口是獲取全部數據。
當咱們須要列表中的一條數據,咱們能夠這樣設計
/v1/list/1
複製代碼
上面接口表示獲取是列表的1號數據,咱們能夠獲取2號、3號數據等等,只要改變數字便可。
結合上面兩步,咱們就能夠設計出增刪改查的 restful 接口了。
接口 | 方法 | 做用 |
---|---|---|
/v1/list | GET | 獲取列表 |
/v1/list | POST | 增長列表 |
/v1/list | PUT | 更新列表 |
/v1/list | DELETE | 刪除列表 |
如下是源碼的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 "刪除一個列表";
}
}
複製代碼
暗號:荊軻刺秦王