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

问题描述 投票:0回答:1

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

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

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

以下是我的代码摘录。

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

非常感谢您的帮助。

spring-boot spring-webflux spring-webclient
1个回答
0
投票

尝试这样的事情

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

private 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,因为这样传递是错误的。

(而且我缩短了您的所有命名,他们疯了很长时间)

© www.soinside.com 2019 - 2024. All rights reserved.