Spring Webflux:Webclient:出错时获取正文

新手上路,请多包涵

我正在使用 spring webflux 的 webclient,如下所示:

 WebClient.create()
            .post()
            .uri(url)
            .syncBody(body)
            .accept(MediaType.APPLICATION_JSON)
            .headers(headers)
            .exchange()
            .flatMap(clientResponse -> clientResponse.bodyToMono(tClass));

它运作良好。我现在想处理来自我正在调用的网络服务的错误(Ex 500 内部错误)。通常我会在“流”上添加一个 doOnError 并使用 Throwable 来测试状态代码,

但我的问题是我想获得 web 服务提供的正文,因为它向我提供了一条我想使用的消息。

我希望无论发生什么都做 flatMap 并测试自己的状态代码以反序列化或不反序列化正文。

原文由 adrien le roy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 804
2 个回答

我更喜欢使用 ClientResponse 提供的方法来处理 http 错误和抛出异常:

 WebClient.create()
         .post()
         .uri( url )
         .body( bodyObject == null ? null : BodyInserters.fromValue( bodyObject ) )
         .accept( MediaType.APPLICATION_JSON )
         .headers( headers )
         .exchange()
         .flatMap( clientResponse -> {
             //Error handling
             if ( clientResponse.statusCode().isError() ) { // or clientResponse.statusCode().value() >= 400
                 return clientResponse.createException().flatMap( Mono::error );
             }
             return clientResponse.bodyToMono( clazz )
         } )
         //You can do your checks: doOnError (..), onErrorReturn (..) ...
         ...

事实上,它与 DefaultWebClient 的 DefaultResponseSpec 中用于处理错误的逻辑相同。 DefaultResponseSpec 是 ResponseSpec 的一个实现,如果我们创建一个 retrieve() 而不是 exchange(),我们将拥有它。

原文由 Zrom 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题