RESTful API更規範的編程接口風格

在這裏插入圖片描述


寫在前面:本文使用SpringMVC的HiddentHttpMethodFilter過濾器演示Restful的模擬增刪改查
作者還在學習階段,本文內容不深,若寫得不好請見諒。
公衆號:小白編碼



REST 風格 URL介紹

什麼是 rest:

  • REST(英文:Representational State Transfer,簡稱 REST) 描述了一個架構樣式的網絡系統, 比如 web 應用程序。它首次出現在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規範的主要編寫者之 一。在目前主流的三種 Web 服務交互方案中,REST 相比於 SOAP(Simple Object Access protocol,簡單 對象訪問協議)以及 XML-RPC 更加簡單明瞭,無論是對 URL 的處理還是對 Payload 的編碼,REST 都傾向於用更 加簡單輕量的方法設計和實現。值得注意的是 REST 並沒有一個明確的標準,而更像是一種設計的風格。
  • 它本身並沒有什麼實用性,其核心價值在於如何設計出符合 REST 風格的網絡接口。

restful 的優點:
它結構清晰、符合標準、易於理解、擴展方便,所以正得到越來越多網站的採用。

restful 的特性:

資源(Resources):網絡上的一個實體,或者說是網絡上的一個具體信息。 它可以是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的存在。可以用一個 URI(統一 資源定位符)指向它,每種資源對應一個特定的 URI 。要 獲取這個資源,訪問它的 URI 就可以, 因此 URI 即爲每一個資源的獨一無二的識別符

表現層(Representation)把資源具體呈現出來的形式,叫做它的表現層(Representation)。
比如,文本可以用 txt 格式表現,也可以用 HTML 格式、XML 格式、JSON 格式表現,甚至可以採用二進制格式。

狀態轉化(State Transfer):每發出一個請求,就代表了客戶端和服務器的一次交互過程。
HTTP 協議,是一個無狀態協議,即所有的狀態都保存在服務器端。因此,如果客戶端想要操作服務器,必須通過某種手段,讓服務器端發生“狀態轉化”(State Transfer)。而這種轉化是建立在表現層之上的,所以就是 “表現層狀態轉化”。
具體說, 就是 HTTP 協議裏面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。

傳統的url路徑

每個方法對應不同的url路徑:傳統的url路徑:每個方法對應不同的url路徑:

@RequeMapping("/user/delete")
public void delete(){
}

@RequeMapping("/user/findAll")
public void findAll(){
}

@RequeMapping("/user/add")
public void add(){
}

Rest風格的url:

@RequeMapping(value = "/user", method = RequestMethod.DELETE)
public void delete(){  // delete請求
}

@RequeMapping(value = "/user",method = RequestMethod.GET)
public void findAll(){ // get請求
}

@RequeMapping(value = "/user",method = RequestMethod.POST)
public void add(){	//post請求
}

在這裏插入圖片描述

使用HiddentHttpMethodFilter示例演示Restful風格url:

作用:由於瀏覽器 form 表單只支持 GET 與 POST 請求,而DELETE、PUT 等 method 並不支持,Spring3.0 添加了一個過濾器,可以將瀏覽器請求改爲指定的請求方式,發送給我們的控制器方法,使得支持 GET、POST、PUT 與DELETE 請求。

源碼:
在這裏插入圖片描述
使用方法:

第一步:在web.xml中配置該過濾器。

第二步:請求方式必須使用post請求。

第三步:按照要求提供_method請求參數,該參數的取值就是我們需要的請求方式(使用隱藏域)。

1.web.xml配置過濾器:

<filter>
    <!-- 
        配置 org.springframework.web.filter.HiddenHttpMethodFilter: 
        可以把 POST 請求轉爲 DELETE 或 POST 請求 
    -->
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2.jsp:請求的地址都是/user

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>Hello,World</h3>
<!-- 保存 -->
<form action="user" method="post">
    用戶名稱:<input type="text" name="uname"><br/>
    <!-- <input type="hidden" name="_method" value="POST"> -->
    <input type="submit" value="保存">
</form>
<hr/>
<!-- 更新 -->
<form action="user/1" method="post">
    用戶名稱:<input type="text" name="uname"><br/>
<%--    需要在發送 POST 請求時攜帶一個 name="_method" 的隱藏域, 值爲 DELETE 或 PUT--%>
    <input type="hidden" name="_method" value="PUT">
    <input type="submit" value="更新">
</form>
<hr/> <!-- 刪除 -->
<form action="user/1" method="post">
<%--    需要在發送 POST 請求時攜帶一個 name="_method" 的隱藏域, 值爲 DELETE 或 PUT--%>
    <input type="hidden" name="_method" value="DELETE">
    <input type="submit" value="刪除">
</form>
<hr/> <!-- 查詢一個 -->
<form action="user/1" method="post">
    <input type="hidden" name="_method" value="GET">
    <input type="submit" value="查詢">
</form>
</body>
</html>


3.Restful風格url定義:

/**
 * @author codewhite
 * @create 2020-05-29 16:11
 */
@Controller
public class RestController {

    /**
     * post請求:保存用戶
     */
    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public String testRestfulURLPOST(User user) {
        System.out.println("rest測試 post:" + user);
        return "success";
    }

    /**
     * put請求:根據用戶id更新用戶
     */
    @RequestMapping(value = "/user/{id}", method = RequestMethod.PUT)
    public String testRestfulURLPUT(@PathVariable("id") Integer id, User user) {
        System.out.println("rest測試 put:" + id + "," + user);
        return "success";
    }

    /**
     * delete請求:根據id刪除用戶
     */
    @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
    public String testRestfulURLDELETE(@PathVariable("id") Integer id) {
        System.out.println("rest測試 delete: " + id);
        return "success";
    }

    /**
     * get請求:根據id查詢用戶
     */
    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    public String testRestfulURLGET(@PathVariable("id") Integer id) {
        System.out.println("rest測試 get:" + id);
        return "success";
    }

}


Debug測試:

1.保存用戶:post請求過來了!請求地址是:/user

在這裏插入圖片描述
從瀏覽器獲取過來了:小白,並且將小白,封裝到user中
在這裏插入圖片描述

控制檯得到:user:

在這裏插入圖片描述

2.更新用戶:put請求!請求地址是/user/1
在這裏插入圖片描述)]
從瀏覽器獲取過來了:小黑,並且將小黑,封裝到user中,此方法由過濾器轉爲PUT請求
在這裏插入圖片描述
控制檯:
在這裏插入圖片描述

3.刪除用戶:delete請求!請求地址是/user/1
在這裏插入圖片描述
收到delete請求裏的id=1,實現刪除用戶功能
在這裏插入圖片描述

控制檯:
在這裏插入圖片描述
4.查詢用戶:get請求!請求地址/user/1

在這裏插入圖片描述
get請求地址發送了一個id爲1,查詢1號。
在這裏插入圖片描述

控制檯:
在這裏插入圖片描述

總結:

restful風格的url,所有方法的路徑都是一樣的:/user,通過發送的請求方式 get/post/delete/put 來確定使用哪個方法,如果兩個方法的請求方式是相同的,則根據所帶參數來判斷調用哪個方法. 如上述代碼的:put請求:根據用戶id更新用戶,delete請求:根據id刪除用戶。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章