动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

编写Spring MVC函数式接口

08-27 17:19 37浏览
举报 T字号
  • 大字
  • 中字
  • 小字

接口是每个程序必不可少的一部分,因为程序的许多功能都需要用到接口。因此,编写接口在软件开发过程中是至关重要的一个环节。本文我们就来学习如何编写Spring MVC函数式接口

一般情况下我们编写Spring MVC接口的范式是这样的:

@RestController

@RequestMapping("/v1/userinfo")

public class UserInfoController {

 

    @GetMapping("/foo")

    public String foo() {

        return "felord.cn";

    }

}

这种写法存在一些弊端,而且使用的频率太高而使得人们逐渐喜欢新的方式。即使用 Spring 5 新引入的函数式端点(Functional Endpoints)来编写接口 这种方式不仅支持Spring MVC,同样也是支持Spring Webflux需要注意的是这种方法要求使用该特性的 Spring 版本不低于Spring 5.2,低于这个版本的可以重新下载或者升级到高于这个版本的版本。下面是具体的编写Spring MVC函数式接口的过程。

1. 依赖

为了演示的方便,这里极简化只引入Spring MVC的starter :

 <dependency>

        org.springframework.boot

        spring-boot-starter-web

 <dependency>

2. RouterFunction

在函数式端点的写法中,传统的请求映射(@RequestMapping)被路由函数(RouterFunction)所代替。上面的写法等同于:

    @Bean

    public RouterFunction fooFunction() {

        return RouterFunctions.route()

                .GET("/v1/userinfo/foo", request -> ServerResponse.ok()

                        .body("felord.cn"))

                .build();

    }

在该示例中,我使RouterFunctions.route()创建一个RouterFunction,然后RouterFunction 提供了从请求到响应的细节操作。

3. ServerRequest/ServerResponse

ServerRequest 是对服务器端的HTTP请求的抽象,你可以通过该抽象获取请求的细节。对应的,ServerResponse 是对服务器端响应的抽象,你也可以通过该抽象构建响应的细节。这两个概念由下面的 HandlerFunction 接口进行 请求→ 响应 处理。

4. HandlerFunction

HandlerFunction 实际上是一个函数式接口,它提供了从请求( ServerRequest)到响应(ServerResponse)的函数映射抽象。通常你的业务逻辑由该接口进行实现。从 ServerRequest 中获取请求的细节,然后根据业务构建一个 ServerResponse 响应。

 

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

5. RequestPredicate

RequestPredicate 可以让你根据请求的一些细节,比如请求方法、请求头、请求参数等等进行断言以决定是否路由。

举一个例子,假如我们希望请求接口/v1/userinfo/predicate时根据不同的参数处理不同的业务,当携带参数 plan时才能进行处理。我们可以这么写:

 

    @Bean

    public RouterFunction predicateFunction() {

        return RouterFunctions.route()

                .GET("/v1/userinfo/predicate",

                        request -> request.param("plan").isPresent(),

                        request -> ServerResponse.ok().body("felord.cn"))

                .build();

    }

然后我们测试一下当携带参数 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

不携带参数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"

}

函数式端点是 Spring 5提供的一个新的接口范式风格,对于Spring MVC来说Spring 5.2 才进行了支持。我们采用函数式端点进行Spring MVC函数式接口的编写,也是顺应函数式编程的一个未来趋势。通过本文的Spring MVC函数式接口的编写的学,我们不仅学习了如何编写Spring MVC函数式接口,还学习了编写Spring MVC函数式接口过程中需要注意的一些细节问题。想更全面地学习Spring MVC就来本站观看Spring MVC视频教程,名师讲解更有说服力!

0人推荐
共同学习,写下你的评论
0条评论
袋子里的小女孩
程序员袋子里的小女孩

12篇文章贡献56226字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消