1

我们计划从 spring Rest-Template 迁移到 Reactor-webclient。

使用 Rest-template,我们编写了自定义日志拦截器,在反序列化之前,我们使用 uniqueId 打印请求和响应。

现在 webclient 提供过滤器,但在过滤器中我无法访问 responseBody 来记录它。

我们有一些第三方 API,它们在错误的情况下发送字符串,在成功的情况下发送一些对象。在这种情况下,我迫不及待地在反序列化后记录响应,因为它会中断,我们将无法记录我们得到的响应。

4

2 回答 2

4

您可以尝试创建一个包装器 WebClient ,它将首先记录响应然后反序列化。

成功响应将落在 doOnSuccess 上,错误将落在 onErrorResume 上。

public <T> Mono<T> get(String url, Map<String, String> headersMap, Class<T> type) {

    Mono<T> responseMono = client.get().uri(url).headers((h) -> headersMap.forEach(h::set)).retrieve()
            .bodyToMono(type);

    return responseMono.doOnSuccess(response -> log.debug("REST GET call to {} is successfull and response is {}",
        url,response).onErrorResume(err -> {
          log.error("Exception occurred calling get({}): {}", url,
              err.getMessage());
          return Mono.error(err);
        });
  }
于 2019-09-23T07:27:00.483 回答
0

这是我用来测试的一些 sudo 代码:

WebClient client = WebClient.create("www.google.com");
ObjectMapper mapper = new ObjectMapper();

client.get()
    .retrieve()
    .bodyToMono(String.class)
    .map(rawBody -> {
        try {
            return mapper.readValue(rawBody, Response.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Cannot deserialize string: " + rawBody);
        }
    });
于 2019-12-30T21:35:28.170 回答