欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章帶你搞懂Java restful 接口開發(fā)

 更新時(shí)間:2021年10月26日 15:00:46   投稿:BJT  
這篇文章主要介紹了Java restful 接口開發(fā)的幾種方式(HTTPS),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

1、RESTful 簡(jiǎn)介

REST:Representational State Transfer,表現(xiàn)層資源狀態(tài)轉(zhuǎn)移。

a>資源

資源是一種看待服務(wù)器的方式,即,將服務(wù)器看作是由很多離散的資源組成。每個(gè)資源是服務(wù)器上一個(gè)可命名的抽象概念。因?yàn)橘Y源是一個(gè)抽象的概念,所以它不僅僅能代表服務(wù)器文件系統(tǒng)中的一個(gè)文件、數(shù)據(jù)庫中的一張表等等具體的東西,可以將資源設(shè)計(jì)的要多抽象有多抽象,只要想象力允許而且客戶端應(yīng)用開發(fā)者能夠理解。與面向?qū)ο笤O(shè)計(jì)類似,資源是以名詞為核心來組織的,首先關(guān)注的是名詞。一個(gè) 資源可以由一個(gè)或多個(gè) URI 來標(biāo)識(shí)。URI 既是資源的名稱,也是資源在 Web 上的地址。對(duì)某個(gè)資源感興趣的客戶端應(yīng)用,可以通過資源的 URI 與其進(jìn)行交互。

b>資源的表述

資源的表述是一段對(duì)于資源在某個(gè)特定時(shí)刻的狀態(tài)的描述??梢栽诳蛻舳?服務(wù)器端之間轉(zhuǎn)移(交換)。資源的表述可以有多種格式,例如 HTML/XML/JSON/純文本/圖片/視頻/音頻等等。資源的表述格式可以通過協(xié)商機(jī)制來確定。請(qǐng)求-響應(yīng)方向的表述通常使用不同的格式。

c>狀態(tài)轉(zhuǎn)移

狀態(tài)轉(zhuǎn)移說的是:在客戶端和服務(wù)器端之間轉(zhuǎn)移(transfer)代表資源狀態(tài)的表述。通過轉(zhuǎn)移和操作資源的表述,來間接實(shí)現(xiàn)操作資源的目的。

2、RESTful 的實(shí)現(xiàn)

具體說,就是 HTTP 協(xié)議里面,四個(gè)表示操作方式的動(dòng)詞:GET、POST、PUT、DELETE。

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

REST 風(fēng)格提倡 URL 地址使用統(tǒng)一的風(fēng)格設(shè)計(jì),從前到后各個(gè)單詞使用斜杠分開,不使用問號(hào)鍵值對(duì)方式攜帶請(qǐng)求參數(shù),而是將要發(fā)送給服務(wù)器的數(shù)據(jù)作為 URL 地址的一部分,以保證整體風(fēng)格的一致性。

操作 傳統(tǒng)方式 REST 風(fēng)格
查詢操作 getUserById?id=1 user/1-->get 請(qǐng)求方式
保存操作 saveUser user-->post 請(qǐng)求方式
刪除操作 deleteUser?id=1 user/1-->delete 請(qǐng)求方式
更新操作 updateUser user-->put 請(qǐng)求方式

3、HiddenHttpMethodFilter

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

SpringMVC 提供了 HiddenHttpMethodFilter 幫助我們將 POST 請(qǐng)求轉(zhuǎn)換為 DELETE 或 PUT 請(qǐng)求。

HiddenHttpMethodFilter 處理 put 和 delete 請(qǐng)求的條件:

  • 當(dāng)前請(qǐng)求的請(qǐng)求方式必須為 post
  • 前請(qǐng)求必須傳輸請(qǐng)求參數(shù)_method

滿足以上條件,HiddenHttpMethodFilter 過濾器就會(huì)將當(dāng)前請(qǐng)求的請(qǐng)求方式轉(zhuǎn)換為請(qǐng)求參數(shù)_method 的值,因此請(qǐng)求參數(shù)_method 的值才是最終的請(qǐng)求方式。

在 web.xml 中注冊(cè) 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 中提供了兩個(gè)過濾器:CharacterEncodingFilter 和 HiddenHttpMethodFilter

在 web.xml 中注冊(cè)時(shí),必須先注冊(cè) CharacterEncodingFilter,再注冊(cè) HiddenHttpMethodFilter

原因:

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

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

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

4、RESTful 案例

4.1、需求

通過 restfull 實(shí)現(xiàn)用戶的增刪改查,需要提供 5 個(gè)接口。

接口 method 描述
/user/list GET 獲取用戶列表
/user/{userId} GET 根據(jù)用戶 id 獲取用戶信息
/user POST 新增用戶信息
/user PUT 保存用戶信息
/user/{userId} DELETE 刪除用戶信息

4.2、git 代碼位置

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

9c531dfb77b5870eb83558aff4c15c0d.png

4.3、UserController

UserController 中實(shí)現(xiàn)了需求中提到的 4 個(gè)接口,大家重點(diǎn)看下每個(gè)接口的方法上用到的注解。

@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();

fb359e3e1eb468807e691156956ae084.png

4.5、測(cè)試效果

將項(xiàng)目發(fā)布到 tomcat,如下圖,跑一下 UserController.http 中的 5 個(gè)用例,點(diǎn)擊每個(gè)用戶中的綠色箭頭即可運(yùn)行,注意下后面 3 個(gè)用例都是 POST 方式提交的,但是參數(shù)中多了一個(gè)_method 參數(shù)用來指定提交的類型,這個(gè)參數(shù)會(huì)被HiddenHttpMethodFilter 解析。

5d2af105258372e24a7bea0f7b640c93.png

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 解決springboot jpa @Column columnDefinition等屬性失效問題

    解決springboot jpa @Column columnDefinition等屬性失效問題

    這篇文章主要介紹了解決springboot jpa @Column columnDefinition等屬性失效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng)

    ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng)

    今天小編就為大家分享一篇關(guān)于ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java利用SPI實(shí)現(xiàn)解耦的示例詳解

    Java利用SPI實(shí)現(xiàn)解耦的示例詳解

    SPI的全稱是服務(wù)提供接口,可以用其來啟動(dòng)框架的擴(kuò)展和替換組件。本文將利用SPI實(shí)現(xiàn)解耦,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-04-04
  • springboot實(shí)現(xiàn)FastJson解析json數(shù)據(jù)的方法

    springboot實(shí)現(xiàn)FastJson解析json數(shù)據(jù)的方法

    本篇文章主要介紹了springboot實(shí)現(xiàn)FastJson解析json數(shù)據(jù)的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • Java編程guava RateLimiter實(shí)例解析

    Java編程guava RateLimiter實(shí)例解析

    這篇文章主要介紹了Java編程guava RateLimiter實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • JAVA獲取Image的三種方式

    JAVA獲取Image的三種方式

    這篇文章主要介紹了JAVA獲取Image的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java String.replace()方法

    Java String.replace()方法"無效"的原因及解決方式

    這篇文章主要介紹了Java String.replace()方法"無效"的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 圖解Java排序算法之希爾排序

    圖解Java排序算法之希爾排序

    這篇文章主要為大家詳細(xì)介紹了Java排序算法之希爾排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Kotlin Coroutines執(zhí)行異步加載示例詳解

    Kotlin Coroutines執(zhí)行異步加載示例詳解

    這篇文章主要給大家介紹了關(guān)于Kotlin Coroutines執(zhí)行異步加載的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 使用java實(shí)現(xiàn)手機(jī)短信驗(yàn)證全過程

    使用java實(shí)現(xiàn)手機(jī)短信驗(yàn)證全過程

    這篇文章主要介紹了使用java實(shí)現(xiàn)手機(jī)短信驗(yàn)證全過程,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論