当前位置: 首页 > 知识库问答 >
问题:

反应式规划如何进行决策

夏侯阳
2023-03-14

我不熟悉反应式编程。为了得到我的手,我试图建立一个简单的RESTAPI,但与请求验证和数据库操作。

以下是我想做的步骤。

  • 验证传入请求参数
  • 验证后保持继续链并从数据库获取
    • 如果用户不存在于db返回一些错误响应
    • 如果用户存在,返回带有用户名的成功响应

    注意:请求和响应由类(UserRequest和UserResponse)表示。DB=使用无功驱动程序的Mongo

    我已经完成了验证工作,但现在我不知道如何继续以及反应式编程的正确方法是什么。

    @Component
    public class UserController {
    
        @Autowired
        private UserRepository userRepository; // repo has find by id method which returns Mono<User>
    
        public Mono<ServerResponse> handleUserRequest(ServerRequest serverRequest) {
    
            Mono<UserRequest> request = validateRequest(serverRequest);
            
            // what should i do here like now i would like to fetch user from db
    
            return ServerResponse.ok().body("Welcome", String.class);
            // how would i return "Welcome <username>";
        }
    
        private Mono<UserRequest> validateRequest(ServerRequest request) {
    
            Mono<UserRequest> userRequest = Mono.just(new UserRequest());
    
            Mono<UserRequest> validateUser = userRequest
                    .map(req -> { //validate id
                        Optional<String> userid = request.queryParam("userid");
    
                        if (user.isPresent() && ObjectId.isValid(userid.get())) {
                            return req.setUserid(userid.get());
                        }
    
                        throw new RequestEntityValidationException("Invalid user");
                    });
    
    
            return validateUser;
        }
    }
    

    还有没有类似的并排教程,在命令式和反应式中分别显示一般代码片段。

共有2个答案

聂溪叠
2023-03-14

使用功能性反应HTTPendpoint时没有内置方式,但您可以尝试https://github.com/making/yavi

您可以对Spring Webflux HTTP控制器使用有效的

邓令雪
2023-03-14

反应式规划的主要思想是始终处理流链。根据db数据获取,您可以使用userRepository获取数据。findUserById(id)或类似于此。因此,您将收到单声道

为了处理这种情况,我建议使用以下代码

public Mono<ServerResponse> handleUserRequest(ServerRequest serverRequest) {
    return validateRequest(serverRequest)
            .flatMap(userRequest -> userRepository.findUserById(userRequest.getUserId())
                    .switchIfEmpty(Mono.error(new RuntimeException("Not found")))
            )
            .flatMap(user -> ServerResponse.ok().body("Welcome " + user.getUsername(), String.class));
}

您可以调整您的validateRequest方法以更具功能性(无需isPresent检查):

private Mono<UserRequest> validateRequest(ServerRequest request) {
    return Mono.just(request)
            .map(req -> request.queryParam("userId")
                    .map(UserRequest::new)
                    .orElseThrow(() -> new RuntimeException("Invalid user"))
            );
}
 类似资料:
  • 本文向大家介绍你是如何规划响应式布局的?相关面试题,主要包含被问及你是如何规划响应式布局的?时的应答技巧和注意事项,需要的朋友参考一下 从项目角度来讲, PC 和 Mobile 是一个项目还是两个项目; 从方法流派来讲, 有栅栏布局,固定 viewport,使用 rem/pt/vw 单位,使用定位百分比,修改为 rem/vw 单位,五种; 从文件结构来讲, 是独立为响应布局专用 css 文件,还是

  • 硬币行问题:有一行n枚硬币,其值为一些正整数C0,C2,Cn-1,不一定不同。目标是提取最大金额的货币,但受限制,不能提取初始行中相邻的两个硬币。 在下面的代码中,n是我的数组C的大小(或硬币的数量),这段代码返回了值[10, 2, 4, 6, 3, 9, 5]的正确结果(正确的结果是25)。但是当我为值[3,12,10]或[3, 12, 10, 2]运行相同的代码时,我得到了错误的结果。(该组值

  • 你如何防抖React.js? 我想防抖手柄。 我试过,但它不起作用。

  • 问题内容: 我很确定它具有内置功能,但是在搜索或在文档中找不到任何内容。是否启用了启用multidex的标记? 另一个要注意的是:有什么方法可以查看哪些库弄乱了您的方法数量?达到64k的限制令人惊讶。 问题答案: 在其他地方找到答案。与为任何常规Android项目启用它没什么不同。 至于方法计数,此站点可以解决问题:http : //inloop.github.io/apk-method-coun

  • 1. 自己选几个项目进行介绍,没有过分深入探究,简单了解一下; 2. EM planner & Lattice planner; 3. EM为什么要先规划路径后规划车速; 4. 决策的作用? 5. 无保护左转涉及的问题? 6. C++使用的多不多? 7. const的三种用法; 8. 智能指针(每次面试都有); 9. 虚函数; 10. stl知道哪些?vector了解多少? 11. 手撕:非递减数