繁体   English   中英

Spring WebFlux 和 WebClient 调用不起作用

[英]Spring WebFlux and WebClient Call not working

我是反应式编程的新手,我有以下 rest 资源调用使用 WebClient 调用现有 Rest API 的服务:

   @PostMapping
    public Mono<String> createUser(@RequestBody UserResourceDTO userResourceDto) {
        return userService.createUser(userResourceDto);
    }

在我的服务中,我有以下方法可以正常工作:

// Working method
   public Mono<String> createUser(UserResourceDTO userResourceDTO){
        return  httpCall(userResourceDTO);
  }

当我使用此方法时,将触发 HTTP 调用并在我的日志中看到它,但由于我不想从此方法返回值,因此我尝试了以下方法:

// Not Working method
    public Mono<String> createUser(UserResourceDTO userResourceDTO){
        Mono<String> rs = httpCall(userResourceDTO);
       return  Mono.just("just a value");
       
        // i plan to trigger another call to the DB this is why i don't want to return the result from httpCall
       // return userRepository.createUser(userResourceDTO);

}

此方法不起作用并且未触发 HTTP 请求(我没有像第一种方法那样在控制台中看到它),任何人都可以向我解释为什么第二种方法没有触发 WebClient 调用以及为什么我有义务从mhttpCall(userResourceDTO);

这是 httpCall 代码:

public Mono<String> httpCall(UserResourceDTO userResourceDTO) {

    WebClient webClient = WebClient.create();

    KeyCloakUser keyCloakUser = new KeyCloakUser();
    // setting values...
  
    return webClient.post()
            .uri(new URI("myurl"))
            .header("Authorization", "Bearer "+toremove)                
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .body(Mono.just(keyCloakUser), KeyCloakUser.class)
            .retrieve()
            .bodyToMono(String.class);
}

这是切换到响应式编程后的常见错误之一。 在你订阅之前,反应式不会发生任何事情。 您需要使用响应式运算符(如flatMapmap等)链接异步/同步函数。

理解该概念的良好起点是Flight of the Flux 1 - Assembly vs Subscription

不正确

public Mono<String> createUser(UserResourceDTO userResourceDTO){
     Mono<String> rs = httpCall(userResourceDTO);
     return  Mono.just("just a value");
}

httpCall(userResourceDTO)不会作为反应流的一部分执行。

正确的

public Mono<String> createUser(UserResourceDTO userResourceDTO){
     return httpCall(userResourceDTO)
        .then(Mono.just("just a value"));
}

继续另一个异步调用

public Mono<String> createUser(UserResourceDTO userResourceDTO){
     return httpCall(userResourceDTO)
        .then(userRepository.createUser(userResourceDTO));
}

或者,如果您需要 HTTP 调用的结果

public Mono<String> createUser(UserResourceDTO userResourceDTO){
     return httpCall(userResourceDTO)
        .flatMap(res -> userRepository.createUser(userResourceDTO));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM