Young Kbt blog Young Kbt blog
首页
  • java基础

    • Java基础
    • Java集合
    • Java反射
    • JavaJUC
    • JavaJVM
  • Java容器

    • JavaWeb
  • Java版本新特性

    • Java新特性
  • SQL 数据库

    • MySQL
    • Oracle
  • NoSQL 数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • ActiveMQ
    • RabbitMQ
    • RocketMQ
    • Kafka
  • 进阶服务

    • Nginx
  • Spring
  • Spring Boot
  • Spring Security
  • 设计模式
  • 算法
  • 知识
  • 管理

    • Maven
    • Git
  • 部署

    • Linux
    • Docker
    • Jenkins
    • Kubernetes
  • 进阶

    • TypeScript
  • 框架

    • React
    • Vue2
    • Vue3
  • 轮子工具
  • 项目工程
  • 友情链接
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 关于
    • Vue2-Admin (opens new window)
    • Vue3-Admin(完善) (opens new window)
GitHub (opens new window)

Shp Liu

朝圣的使徒,正在走向编程的至高殿堂!
首页
  • java基础

    • Java基础
    • Java集合
    • Java反射
    • JavaJUC
    • JavaJVM
  • Java容器

    • JavaWeb
  • Java版本新特性

    • Java新特性
  • SQL 数据库

    • MySQL
    • Oracle
  • NoSQL 数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • ActiveMQ
    • RabbitMQ
    • RocketMQ
    • Kafka
  • 进阶服务

    • Nginx
  • Spring
  • Spring Boot
  • Spring Security
  • 设计模式
  • 算法
  • 知识
  • 管理

    • Maven
    • Git
  • 部署

    • Linux
    • Docker
    • Jenkins
    • Kubernetes
  • 进阶

    • TypeScript
  • 框架

    • React
    • Vue2
    • Vue3
  • 轮子工具
  • 项目工程
  • 友情链接
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 关于
    • Vue2-Admin (opens new window)
    • Vue3-Admin(完善) (opens new window)
GitHub (opens new window)
  • Spring

  • Spring MVC

  • Spring Boot

    • Spring Boot - 生命周期与事件
    • Spring Boot - 事件驱动
    • Spring Boot - Bean 加载方式
    • Spring Boot - Aware
    • Spring Boot - 多环境配置
    • Spring Boot - 定时任务
    • Spring Boot - 异步任务
    • Spring Boot - 内置日志
    • Spring Boot - 函数式 Web
      • 前言
      • 介绍
      • 使用
    • Spring Boot - 响应式远程调用
    • Spring Boot - 接口文档
    • Spring Boot - 单元测试
    • Spring Boot - 内容协商
    • Spring Boot - 参数校验
    • Spring Boot - RestTemplate
    • Spring Boot - 映射请求
    • Spring Boot - 请求参数接收
    • Spring Boot - 通用响应类
    • Spring Boot - 全局异常处理
  • Spring Security

  • Spring Cloud

  • Spring生态
  • Spring Boot
Young Kbt
2023-10-29
目录

Spring Boot - 函数式 Web

  • 前言
  • 介绍
  • 使用

# 前言

我们现在常用的 Spring Boot Web 开发是使用注解 @Controller + @RequestMapping 耦合式(路由、业务耦合)以及衍生的 xxMapping 来接受请求。

现在内容介绍一下 Web 访问的另一种形式,通过 函数式 Web(路由、业务分离)实现一个 Restful 风格的 Http 请求案例。函数式 Web 是 Spring5.2 之后的一个新特性,可以通过函数去定义 Web 请求的处理流程,使得代码更为简洁,耦合性也降低了。

# 介绍

函数式 Web 的四大核心对象:

  • RouterFunction:定义路由信息

  • RequestPredicates:定义请求规则,包括请求参数、请求方式等

  • ServerRequest:封装请求参数

  • ServerResponse:封装响应参数

# 使用

MyUserHandler 类

@Slf4j
@Service
public class UserBizHandler {
    public ServerResponse getUser(ServerRequest request) {
        User user = new User("张三", "12345678");
        return ServerResponse.ok().body(user);
    }

    public ServerResponse getUsers(ServerRequest request) {
        List<User> users = new ArrayList<>();
        users.add(new User("张三","1234"));
        users.add(new User("李四","abc"));
        users.add(new User("王五","hello"));
        // body 中的对象就是 @ResponseBody 的原理,利用 HttpMessageConverter 写出为 json
        return ServerResponse.ok().body(users);
    }

    public ServerResponse createUser(ServerRequest request) throws ServletException, IOException {
        User user = request.body(User.class);
        log.info("创建用户:{}",user);
        return ServerResponse.ok().build();
    }

    public ServerResponse deleteUser(ServerRequest request){
        String id = request.pathVariable("id");
        log.info("删除用户:{}",id);
        return ServerResponse.ok().build();
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

函数式 Web 配置类

@Configuration
public class WebFunctionConfig {
    @Bean
    public RouterFunction<ServerResponse> router(UserBizHandler userBizHandler) {
        return RouterFunctions.route()
                .GET("/user/{id}", RequestPredicates.accept(MediaType.ALL), userBizHandler::getUser)
                .GET("/users", RequestPredicates.accept(MediaType.ALL), userBizHandler::getUsers)
                .POST("/user", RequestPredicates.accept(MediaType.APPLICATION_JSON), userBizHandler::createUser)
                .DELETE("/user/{id}", RequestPredicates.accept(MediaType.ALL), userBizHandler::deleteUser)
                .build();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

可以知道使用函数式 Web,接收的参数是 ServerRequest,可以从 ServerRequest 里取出参数或者请求头。返回值必须是 ServerResponse,该类是 Spring Boot 针对函数式 Web 封装好的响应类。

请求 /user/1,则走入 /user/{id} 的处理方式,即进入 userBizHandler 的 getUser() 方法里。

RequestPredicates.accept(MediaType.APPLICATION_JSON) 代表该请求只接受 JSON 数据,如果不是 JSON 数据,则不会进入对应的方法里。

编辑此页 (opens new window)
#Spring Boot
更新时间: 2023/10/29, 16:57:28
Spring Boot - 内置日志
Spring Boot - 响应式远程调用

← Spring Boot - 内置日志 Spring Boot - 响应式远程调用→

最近更新
01
技术随笔 - Element Plus 修改包名 原创
11-02
02
Reactor - 扩展性
11-02
03
Reactor - 最佳实践
11-02
更多文章>
Theme by Vdoing | Copyright © 2021-2024 Young Kbt | blog
桂ICP备2021009994号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式