目录

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 数据,则不会进入对应的方法里。

更新时间: 2024/01/17, 05:48:13
最近更新
01
JVM调优
12-10
02
jenkins
12-10
03
Arthas
12-10
更多文章>