溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Java restful接口開發

發布時間:2021-10-26 16:08:36 來源:億速云 閱讀:272 作者:iii 欄目:開發技術

這篇文章主要介紹“如何理解Java restful接口開發”,在日常操作中,相信很多人在如何理解Java restful接口開發問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解Java restful接口開發”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • 1、RESTful 簡介

    • a>資源

    • b>資源的表述

    • c>狀態轉移

  • 2、RESTful 的實現

    • 3、HiddenHttpMethodFilter

      • 4、RESTful 案例

        • 4.1、需求

        • 4.2、git 代碼位置

        • 4.3、UserController

        • 4.4、添加 HiddenHttpMethodFilter

        • 4.5、測試效果


      1、RESTful 簡介

      REST:Representational State Transfer,表現層資源狀態轉移。

      a>資源

      資源是一種看待服務器的方式,即,將服務器看作是由很多離散的資源組成。每個資源是服務器上一個可命名的抽象概念。因為資源是一個抽象的概念,所以它不僅僅能代表服務器文件系統中的一個文件、數據庫中的一張表等等具體的東西,可以將資源設計的要多抽象有多抽象,只要想象力允許而且客戶端應用開發者能夠理解。與面向對象設計類似,資源是以名詞為核心來組織的,首先關注的是名詞。一個 資源可以由一個或多個 URI 來標識。URI 既是資源的名稱,也是資源在 Web 上的地址。對某個資源感興趣的客戶端應用,可以通過資源的 URI 與其進行交互。

      b>資源的表述

      資源的表述是一段對于資源在某個特定時刻的狀態的描述??梢栽诳蛻舳?服務器端之間轉移(交換)。資源的表述可以有多種格式,例如 HTML/XML/JSON/純文本/圖片/視頻/音頻等等。資源的表述格式可以通過協商機制來確定。請求-響應方向的表述通常使用不同的格式。

      c>狀態轉移

      狀態轉移說的是:在客戶端和服務器端之間轉移(transfer)代表資源狀態的表述。通過轉移和操作資源的表述,來間接實現操作資源的目的。

      2、RESTful 的實現

      具體說,就是 HTTP 協議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。

      它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。

      REST 風格提倡 URL 地址使用統一的風格設計,從前到后各個單詞使用斜杠分開,不使用問號鍵值對方式攜帶請求參數,而是將要發送給服務器的數據作為 URL 地址的一部分,以保證整體風格的一致性。

      操作傳統方式REST 風格
      查詢操作getUserById?id=1user/1-->get 請求方式
      保存操作saveUseruser-->post 請求方式
      刪除操作deleteUser?id=1user/1-->delete 請求方式
      更新操作updateUseruser-->put 請求方式

      3、HiddenHttpMethodFilter

      由于瀏覽器只支持發送 get 和 post 方式的請求,那么該如何發送 put 和 delete 請求呢?

      SpringMVC 提供了 HiddenHttpMethodFilter 幫助我們將 POST 請求轉換為 DELETE 或 PUT 請求。

      HiddenHttpMethodFilter 處理 put 和 delete 請求的條件:

      • 當前請求的請求方式必須為 post

      • 前請求必須傳輸請求參數_method

      滿足以上條件,HiddenHttpMethodFilter 過濾器就會將當前請求的請求方式轉換為請求參數_method 的值,因此請求參數_method 的值才是最終的請求方式。

      在 web.xml 中注冊 HiddenHttpMethodFilter

      <filter>
          <filter-name>HiddenHttpMethodFilter</filter-name>
          <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filterclass>
      </filter>
      <filter-mapping>
          <filter-name>HiddenHttpMethodFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>

      使用注意:

      目前為止,SpringMVC 中提供了兩個過濾器:CharacterEncodingFilter 和 HiddenHttpMethodFilter

      在 web.xml 中注冊時,必須先注冊 CharacterEncodingFilter,再注冊 HiddenHttpMethodFilter

      原因:

      在 CharacterEncodingFilter 中通過 request.setCharacterEncoding(encoding) 方法設置字符集的

      request.setCharacterEncoding(encoding) 方法要求前面不能有任何獲取請求參數的操作而 HiddenHttpMethodFilter 恰恰有一個獲取請求方式的操作:

      String paramValue = request.getParameter(this.methodParam);

      4、RESTful 案例

      4.1、需求

      通過 restfull 實現用戶的增刪改查,需要提供 5 個接口。

      接口method描述
      /user/listGET獲取用戶列表
      /user/{userId}GET根據用戶 id 獲取用戶信息
      /userPOST新增用戶信息
      /userPUT保存用戶信息
      /user/{userId}DELETE刪除用戶信息

      4.2、git 代碼位置

      https://gitee.com/javacode2018/springmvc-series

      如何理解Java restful接口開發

      4.3、UserController

      UserController 中實現了需求中提到的 4 個接口,大家重點看下每個接口的方法上用到的注解。

      @RestController
      public class UserController {
          private List<User> userList = new ArrayList<>();
       
          {
              userList.add(new User(1, "Spring高手系列"));
              userList.add(new User(2, "SpringMVC系列"));
          }
       
          @GetMapping("/user/list")
          public List<User> list() {
              System.out.println("list()");
              return userList;
          }
       
          @GetMapping("/user/{userId}")
          public User getUser(@PathVariable("userId") Integer userId) {
              System.out.println("getUser()");
              for (User user : userList) {
                  if (user.getUserId().equals(userId)) {
                      return user;
                  }
              }
              return null;
          }
       
          @PostMapping(value = "/user", produces = "text/html;charset=UTF-8")
          public String add(User user) {
              System.out.println("add()");
              this.userList.add(user);
              return "新增成功";
          }
       
          @PutMapping(value = "/user", produces = "text/html;charset=UTF-8")
          public String modify(User user) {
              System.out.println("modify()");
              for (User item : userList) {
                  if (item.getUserId().equals(user.getUserId())) {
                      item.setName(user.getName());
                  }
              }
              return "修改成功";
          }
       
          @DeleteMapping(value = "/user/{userId}", produces = "text/html;charset=UTF-8")
          public String delete(@PathVariable("userId") Integer userId) {
              System.out.println("delete()");
              Iterator<User> iterator = userList.iterator();
              while (iterator.hasNext()) {
                  User user = iterator.next();
                  if (user.getUserId().equals(userId)) {
                      iterator.remove();
                  }
              }
              return "刪除成功";
          }
       
       
          public static class User {
              private Integer userId;
              private String name;
       
              public User() {
              }
       
              public User(Integer userId, String name) {
                  this.userId = userId;
                  this.name = name;
              }
       
              public Integer getUserId() {
                  return userId;
              }
       
              public void setUserId(Integer userId) {
                  this.userId = userId;
              }
       
              public String getName() {
                  return name;
              }
       
              public void setName(String name) {
                  this.name = name;
              }
       
              @Override
              public String toString() {
                  return "User{" +
                          "userId=" + userId +
                          ", name='" + name + '\'' +
                          '}';
              }
          }
      }

      4.4、添加 HiddenHttpMethodFilter

      HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();

      如何理解Java restful接口開發

      4.5、測試效果

      將項目發布到 tomcat,如下圖,跑一下 UserController.http 中的 5 個用例,點擊每個用戶中的綠色箭頭即可運行,注意下后面 3 個用例都是 POST 方式提交的,但是參數中多了一個_method 參數用來指定提交的類型,這個參數會被HiddenHttpMethodFilter 解析。

      如何理解Java restful接口開發

      到此,關于“如何理解Java restful接口開發”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

      向AI問一下細節

      免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

      AI

      亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女