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
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
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)
更新时间: 2023/10/29, 16:57:28