最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用新方式編寫Spring MVC接口

 更新時間:2020年09月15日 10:25:11   作者:碼農(nóng)小胖哥  
這篇文章主要介紹了如何使用新方式編寫Spring MVC接口,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

1. 前言

通常我們編寫 Spring MVC 接口的范式是這樣的:

@RestController
@RequestMapping("/v1/userinfo")
public class UserInfoController {

  @GetMapping("/foo")
  public String foo() {
    return "felord.cn";
  }
}

這種我都寫吐了,今天換個口味,使用 Spring 5 新引入的函數(shù)式端點(Functional Endpoints)來耍耍。這種方式同樣支持 Spring Webflux。

請注意可使用該特性的 Spring 版本不低于 Spring 5.2

2. 依賴

為了演示,這里極簡化只引入 Spring MVC 的 starter :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

3. RouterFunction

在函數(shù)式端點的寫法中,傳統(tǒng)的請求映射(@RequestMapping)被路由函數(shù)(RouterFunction)所代替。上面的寫法等同于:

  @Bean
  public RouterFunction<ServerResponse> fooFunction() {
    return RouterFunctions.route()
        .GET("/v1/userinfo/foo", request -> ServerResponse.ok()
            .body("felord.cn"))
        .build();
  }

在該示例中,我使用了 RouterFunctions.route() 創(chuàng)建了一個RouterFunction,然后RouterFunction 提供了從請求到響應(yīng)的細節(jié)操作。

4. ServerRequest/ServerResponse

ServerRequest 是對服務(wù)器端的 HTTP 請求的抽象,你可以通過該抽象獲取請求的細節(jié)。對應(yīng)的,ServerResponse 是對服務(wù)器端響應(yīng)的抽象,你也可以通過該抽象構(gòu)建響應(yīng)的細節(jié)。這兩個概念由下面的 HandlerFunction 接口進行 請求 → 響應(yīng) 處理。

5. HandlerFunction

HandlerFunction 是一個函數(shù)式接口,它提供了從請求( ServerRequest)到響應(yīng)(ServerResponse)的函數(shù)映射抽象。通常你的業(yè)務(wù)邏輯由該接口進行實現(xiàn)。從 ServerRequest 中獲取請求的細節(jié),然后根據(jù)業(yè)務(wù)構(gòu)建一個 ServerResponse 響應(yīng)。

HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().body("felord.cn");

6. RequestPredicate

RequestPredicate 可以讓你根據(jù)請求的一些細節(jié),比如 請求方法、請求頭、請求參數(shù)等等進行斷言以決定是否路由。

這里舉一個例子,假如我們希望請求接口/v1/userinfo/predicate時根據(jù)不同的參數(shù)處理不同的業(yè)務(wù),當(dāng)攜帶參數(shù) plan時才能進行處理。我們可以這么寫:

  @Bean
  public RouterFunction<ServerResponse> predicateFunction() {
    return RouterFunctions.route()
        .GET("/v1/userinfo/predicate",
            request -> request.param("plan").isPresent(),
            request -> ServerResponse.ok().body("felord.cn"))
        .build();
  }

然后我們測試一下:

當(dāng)攜帶參數(shù) plan時:

GET http://localhost:8080/v1/userinfo/predicate?plan=

HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 9
Date: Thu, 14 May 2020 07:57:35 GMT
Keep-Alive: timeout=60
Connection: keep-alive

felord.cn

不攜帶參數(shù)plan時:

GET http://localhost:8080/v1/userinfo/predicate

HTTP/1.1 404
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 14 May 2020 08:00:15 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
 "timestamp": "2020-05-14T08:00:15.659+0000",
 "status": 404,
 "error": "Not Found",
 "message": "No message available",
 "path": "/v1/userinfo/predicate"
}

7. 小結(jié)

函數(shù)式端點是 Spring 5 提供的一個新的接口范式風(fēng)格,對于 Spring MVC 來說 Spring 5.2 才進行了支持。也是順應(yīng)函數(shù)式編程的一個未來趨勢。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • servlet配置方法及其生命周期詳解

    servlet配置方法及其生命周期詳解

    下面小編就為大家?guī)硪黄猻ervlet配置方法及其生命周期詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 關(guān)于Mysql的四種存儲引擎

    關(guān)于Mysql的四種存儲引擎

    這篇文章主要介紹了關(guān)于Mysql的四種存儲引擎,MySql的核心就是存儲引擎,不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以 獲得特定的功能,需要的朋友可以參考下
    2023-05-05
  • Java實現(xiàn)寵物商店管理系統(tǒng)

    Java實現(xiàn)寵物商店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)寵物商店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • String字符串拼接方法concat和+的效率對比

    String字符串拼接方法concat和+的效率對比

    這篇文章主要介紹了String字符串拼接方法concat和+的效率對比,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java?C++算法題解leetcode801使序列遞增的最小交換次數(shù)

    Java?C++算法題解leetcode801使序列遞增的最小交換次數(shù)

    這篇文章主要為大家介紹了Java?C++題解leetcode801使序列遞增的最小交換次數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Java使用RedisTemplate操作Redis遇到的坑

    Java使用RedisTemplate操作Redis遇到的坑

    這篇文章主要介紹了Java使用RedisTemplate操作Redis遇到的坑,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Mybatis-Plus中使用@DS注解動態(tài)選擇數(shù)據(jù)源的源碼解讀

    Mybatis-Plus中使用@DS注解動態(tài)選擇數(shù)據(jù)源的源碼解讀

    這篇文章主要介紹了Mybatis-Plus中使用@DS注解動態(tài)選擇數(shù)據(jù)源的源碼解讀,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot中注解@AliasFor的使用詳解

    SpringBoot中注解@AliasFor的使用詳解

    這篇文章主要為大家詳細介紹了SpringBoot中注解@AliasFor的用法,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-05-05
  • java不使用第三變量交換兩個變量的值

    java不使用第三變量交換兩個變量的值

    這篇文章主要介紹了java不使用第三變量交換兩個變量的值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java詳解Swing中的幾種常用按鈕的使用

    Java詳解Swing中的幾種常用按鈕的使用

    這篇文章主要介紹了怎么用Java來創(chuàng)建和使用Swing中的幾種常用按鈕,按鈕是我們經(jīng)常要用的工具,但是你有想過自己怎么去實現(xiàn)它嗎,感興趣的朋友跟隨文章往下看看吧
    2022-04-04

最新評論

大港区| 依兰县| 大理市| 桦甸市| 巧家县| 冷水江市| 莎车县| 张家界市| 青州市| 永宁县| 霍州市| 封丘县| 平罗县| 会东县| 桑日县| 东乡| 北宁市| 荆州市| 鹤峰县| 从化市| 都昌县| 扶沟县| 云阳县| 祁东县| 光泽县| 阳春市| 乌兰察布市| 乌鲁木齐县| 鲁山县| 友谊县| 囊谦县| 会理县| 新疆| 阿坝县| 永安市| 裕民县| 广东省| 家居| 仙桃市| 社会| 博罗县|