spring-boot - 如何在 Spring WebClient 中验证响应对象

标签 spring-boot spring-webflux spring-webclient

我正在使用Springs 的 Webclient 进行 HTTP GET 调用。

如何验证作为 HTTP 调用响应收到的响应对象 GetPersonBasicInfoResWrapper 的属性。

我试图通过阻止响应对象来验证 flatMap 内的 birthDate,但它看起来并不是最实用的方法。

以下是我的代码摘录。

private Mono<GetPersonBasicInfoResWrapper> getPersonBasicInfo(Double personId, LocalDate birthDate,
            CallerRequestMetaData callerInfo) {
        return middlewareWebClient
                .get()
                .uri(...)
                ...
                ...
                .exchange()
                .flatMap(client -> {
                    GetPersonBasicInfoResWrapper block = client.bodyToMono(GetPersonBasicInfoResWrapper.class).block();
                    
                    LocalDate personBirthDate = LocalDateTime.ofInstant(block.getBirthDate().toInstant(),ZoneId.of(Constants.DEFAULT_TIME_ZOME)).toLocalDate();
                    
                    if (!personBirthDate.equals(birthDate))
                        throw new YakeenRowadException(Errors.INCORRECT_ID_BIRTH_DATE_G, birthDate.toString()); 
                    else
                        return client.bodyToMono(GetPersonBasicInfoResWrapper.class);
                });
}

非常感谢任何帮助。

最佳答案

尝试这样的事情

private Mono<PersonInfo> getPersonInfo(Double personId) {
    return webClient.get()
            .uri(...)
            .exchange()
            .flatMap(response -> {
                return response.bodyToMono(PersonInfo.class);
            });
}

private LocalDate toLocalDate(Instant instant) {
    return LocalDateTime.ofInstant(instant, ZoneId.of(Constants.DEFAULT_TIME_ZOME))
                        .toLocalDate();
}

public Mono<PersonInfo> doSomething(Double personId, LocalDate birthDate) {
    return getPersonInfo(personId)
             .flatMap(personInfo -> {
                final LocalDate birthDate = toLocalDate(personInfo.getBirthDate().toInstant());
                if (!personBirthDate.equals(birthDate)) { 
                    return Mono.error(new YakeenRowadException(Errors.INCORRECT_ID_BIRTH_DATE_G, birthDate.toString()));
                }
                return Mono.just(personInfo);
            });
}

在获取过程中不要验证,验证是业务逻辑,应该在上面的层中。

  1. 您获取并返回
  2. 您验证。
  3. 如果验证失败,您将向调用客户端返回 Mono.error()。

我不知道“元数据”应该是什么。我希望这不是 url,因为以这种方式传递它是错误的。

(尽量避免冗长的命名)

关于spring-boot - 如何在 Spring WebClient 中验证响应对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60925208/

相关文章:

javascript - 将应用程序部署到 Heroku,在后端 Java Spring Boot 中抛出 500 内部服务器错误,同时在本地环境中完美运行

java - 如何使用AOP计算 Controller 类中调用的所有内部服务的响应时间

spring - 真的有必要将 Hystrix 与响应式(Reactive) spring boot 2 应用程序一起使用吗?

spring-boot - Spring WebClient 作为 RestTemplate 的替代品

java - 使用 Spring WebClient 时没有从端点接收到数据,但我可以使用curl 来获取数据

java - Maven 从曾祖 parent 而不是我们的 parent 依赖管理中采购依赖版本

java - Spring Data Neo4J 中是否有 Multi-Tenancy 数据源

spring - 如何将 Mono<String> 转换为 Mono<MyObject>?

java - WebClient 从订阅返回值

java - 使用Spring WebClient在java中上传文件