换一种方式编写 Spring MVC 接口
1. 前言
通常我们编写 Spring MVC 接口的范式是这样的:
@RestController @RequestMapping("/v1/userinfo") public class UserInfoController { @GetMapping("/foo") public String foo() { return "felord.cn"; } }
这种我都写吐了,今天换个口味,使用 Spring 5 新引入的函数式端点(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
在函数式端点的写法中,传统的请求映射(@RequestMapping
)被路由函数(RouterFunction
)所代替。上面的写法等同于:
@Bean public RouterFunction<ServerResponse> fooFunction() { return RouterFunctions.route() .GET("/v1/userinfo/foo", request -> ServerResponse.ok() .body("felord.cn")) .build(); }
在该示例中,我使用了 RouterFunctions.route()
创建了一个RouterFunction
,然后RouterFunction
提供了从请求到响应的细节操作。
4. ServerRequest/ServerResponse
ServerRequest
是对服务器端的HTTP请求的抽象,你可以通过该抽象获取请求的细节。对应的,ServerResponse
是对服务器端响应的抽象,你也可以通过该抽象构建响应的细节。这两个概念由下面的 HandlerFunction
接口进行 请求→ 响应 处理。
5. HandlerFunction
HandlerFunction
是一个函数式接口,它提供了从请求( ServerRequest
)到响应(ServerResponse
)的函数映射抽象。通常你的业务逻辑由该接口进行实现。从 ServerRequest
中获取请求的细节,然后根据业务构建一个 ServerResponse
响应。
HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().body("felord.cn");
6. RequestPredicate
RequestPredicate
可以让你根据请求的一些细节,比如 请求方法、请求头、请求参数等等进行断言以决定是否路由。
这里举一个例子,假如我们希望请求接口/v1/userinfo/predicate
时根据不同的参数处理不同的业务,当携带参数 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(); }
然后我们测试一下:
当携带参数 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" }
7. 小结
函数式端点是 Spring 5 提供的一个新的接口范式风格,对于 Spring MVC 来说 Spring 5.2 才进行了支持。也是顺应函数式编程的一个未来趋势。由于篇幅原因这里仅仅对其中的关键概念进行了讲解。下一篇我们会对这种接口范式进行进一步的讲解和实际使用。敬请关注:码农小胖哥 。
关注公众号:Felordcn获取更多资讯
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何处理暗数据?
【摘要】有研究表明,全球数据总量每两年翻一番,各企业都在处理和存储这些海量数据。这些数据主要由结构化数据、非结构化数据等类型数据构成。企业对数据了解得越透彻,就能够越准确地判断数据的价值及风险。 结构化的数据:即有固定格式和有限长度的数据。例如填的表格就是结构化的数据,国籍:中华人民共和国,民族:汉,性别:男,这都叫结构化数据。对于ICT领域来说,就是以固定的格式存储到数据库里的数据(Oracle/MySQL/…)。 半结构化数据:是一些 XML 或者 HTML 的格式的,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。 非结构化的数据:就是不定长、无固定格式的数据,例如网页,邮件,有时候非常长;有时候非常短,几句话就没了;例如Word文档、语音,视频、图片都是非结构化的数据。现在非结构化的数据居多。 为了描述方便,我们把半结构化数据和非结构化数据,合二为一统称为“暗数据”,当然这个词不是我起的,是AA公司起的名字。AA(Automation Anywhere)公司于2003年最初由Ankur Kothari,Mihir Shukla,Neeti Mehta和Ru...
- 下一篇
结合豆瓣第三方登录理解 OAuth2.0 授权码方式
前言 最近在学习 Spring-Security-Oauth2 ,在此之前必然要研究下 oauth2.0 协议规范。 关于 oauth2.0 的相关概念及理解,这里推荐阅读以下文章: oauth2.0 入门文章 阮一峰 - OAuth 2.0 的一个简单解释 阮一峰 - OAuth 2.0 的四种方式 需要声明的是这 2 篇文章中有些错误,主要是关于 redirect_uri 部分,评论区有人已经指出了错误,所以阅读时,请结合评论区内容。(是的,你没看错,即使有错误也是强烈推荐阅读。) oauth2.0 进阶篇 关于 OAuth2.0 安全性你应该要知道的一些事 The OAuth 2.0 Authorization Framework 这两篇文章可以放在本文之后去看 而本文的会通过一个案例 - 通过第三方(微博)去登录豆瓣,去分析oauth2 的 授权码模式。 整个流程可以亲自去 豆瓣 实验一下,篇幅原因整个登录流程就不贴图演示了, 另外,豆瓣在这个过程中加上了绑定手机号(现在大多数平台都这么干),这个过程我们忽略过去。 在阅读正文之前,就假设已经理解了 oauth2.0 入门的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7设置SWAP分区,小内存服务器的救世主