1. 程式人生 > >如何設計一個優雅的RESTFUL的介面

如何設計一個優雅的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

暗號:荊軻刺秦王