重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程)
- 3.4 函数式 Web
 
3.4 函数式 Web
个人写过 go 类似于 go + gin 框架
1、场景
场景: User RESTful - CRUD
- GET/user/1 获取1号用户
- GET/users 获取所有用户
- POST/user 清求体携带JSON,新增一个用户
- PUT/user/1 请求体携带JSON,修改1号用户
- DELETE/user/1删除1号用户
2、核心类
- RouterFunction: 定义路由信息(发什么请求,谁来处理)
- RequestPredicate: 定义请求规则:请求谓语、请求方式(GET、POST)、请求参数
- ServerRequest: 封装请求完整的数据
- ServerResponse: 封装响应完整的数据
3、实战
- 新建 Person 类
package com.zhong.web.dto;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * @ClassName : Person
 * @Description :
 * @Author : zhx
 * @Date: 2024-06-02 13:05
 */
@JacksonXmlRootElement // 加入注解使其可以输出 xml
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private Integer id;
    private String userName;
    private String like;
    private Integer age;
}
- 新建 WebFuntionConfig 建立所有路由与函数的映射
package com.zhong.web.config;
import com.zhong.web.biz.UserBizHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.function.*;
/**
 * @ClassName : WebFuntionConfig
 * @Description :
 * @Author : zhx
 * @Date: 2024-06-02 15:31
 */
@Configuration
public class WebFunctionConfig {
    /**
     * 函数式 web:
     * 1、给容器中仿一个 Bean: 类型是 RouterFunction<ServerResponse> 集中所有路由与对应处理函数信息
     * 2、给每个业务准备应该 Handler
     *
     * 核心四大对象:
     *      1、RouterFunction:   定义路由信息(发什么请求,谁来处理)
     *      2、RequestPredicate: 定义请求规则:请求谓语、请求方式(GET、POST)、请求参数
     *      3、ServerRequest:    封装请求完整的数据
     *      4、ServerResponse:   封装响应完整的数据
     */
    @Bean
    public RouterFunction<ServerResponse> userRouter(UserBizHandler userBizHandler) {
        return RouterFunctions.route()     // 开始定义路由信息
                .GET("/user/{id}", RequestPredicates.accept(MediaType.ALL), userBizHandler::getUser)
                .GET("/users", userBizHandler::getUserAll)
                .POST("/user", RequestPredicates.accept(MediaType.APPLICATION_JSON), userBizHandler::addUser)
                .PUT("/user/{id}", RequestPredicates.accept(MediaType.APPLICATION_JSON), userBizHandler::updateUser)
                .DELETE("/user/{id}", userBizHandler::deleteUser)
                .build();
    }
}
- 新建 UserBizHandler 处理路由对应的函数处理方法(业务逻辑)
package com.zhong.web.biz;
import com.zhong.web.dto.Person;
import jakarta.servlet.ServletException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
 * @ClassName : UserBizHandler
 * @Description :
 * @Author : zhx
 * @Date: 2024-06-02 15:40
 */
@Slf4j
@Service
public class UserBizHandler {
    public ServerResponse getUser(ServerRequest request) {
        String id = request.pathVariable("id");
        log.info("查询的用户id为 [{}] ", id);
        // 业务处理
        Person person = new Person(1, "小钟", "小王", 23);
        // 构造响应
        return ServerResponse
                .ok()
                .body(person);
    }
    public ServerResponse getUserAll(ServerRequest serverRequest) {
        log.info("查询所有用户成功!");
        List<Person> users = Arrays.asList(
                new Person(1, "小钟", "小王", 23),
                new Person(1, "小王", "小钟", 21));
        return ServerResponse
                .ok()
                .body(users);
    }
    public ServerResponse addUser(ServerRequest serverRequest) throws ServletException, IOException {
        Object body = serverRequest.body(Person.class);
        log.info("添加用户成功");
        return ServerResponse
                .ok()
                .body(body);
    }
    public ServerResponse updateUser(ServerRequest serverRequest) throws ServletException, IOException {
        Object body = serverRequest.body(Person.class);
        log.info("更新用户成功");
        return ServerResponse
                .ok()
                .body(body);
    }
    public ServerResponse deleteUser(ServerRequest serverRequest) {
        String id = serverRequest.pathVariable("id");
        log.info("删除用户 【{}】成功!", id);
        return ServerResponse
                .ok()
                .body(id);
    }
}
- 重新启动项目使用 Postman 测试
- 根据 id 查询单个用户
http://localhost:8080/user/1

- 查询所有用户
http://localhost:8080/users

- 添加用户
http://localhost:8080/user

- 修改用户
http://localhost:8080/user/1

- 删除用户
localhost:8080/user/1

- log 日志




















