反应式编程如何做决策

穆罕默德·伊利亚斯(Muhammad Ilyas)

我是反应式编程的新手。为了帮助我,我尝试构建一个简单的rest api,但具有请求验证和数据库操作。

这是我想做的步骤。

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

注意:请求和响应由类(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;
    }
}

也有任何并行的教程,例如以命令式显示然后以响应式显示通用代码段。

mslowiak

反应式编程的主要思想是一直使用流链。根据db数据获取,您可以获取与userRepository.findUserById(id)此类似的数据结果,您将收到Mono<User>可以具有或没有价值的值-那么它是一个空的Mono。

为了处理这种情况,我建议以这种方式编写代码:

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"))
            );
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章