当前位置: 首页 > 知识库问答 >
问题:

SpringWebClient-如何记录成功和失败的响应?

弘志勇
2023-03-14

我正在尝试使用Web客户端创建REST调用

statusWebClient.post()
                .uri(url)
                .bodyValue(createBody(state, number))
                .retrieve()
                .bodyToFlux(String.class)
                .doOnEach(response -> log.debug("Notification was sent to {}, response {}", url, response.get()))
                .doOnError(exception -> log.warn("Failed to send notification to {}, cause {}", url, exception.getMessage()))
                .subscribe();

我只想记录通话结果。成功时 - 使用响应正文记录成功消息,在 5XX 或超时或其他时 - 记录错误消息。日志应该在后台创建(而不是由创建调用的线程创建)但是doOnEach每次都会执行,doOnError工作正常,但也有

reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.web.reactive.function.client.WebClientResponseException$InternalServerError: 500 Internal Server Error from POST

记录在日志文件中。

我也在一些教程中看到过成功方法,但在我的设置中有这样的方法。

如何记录成功和失败消息?

共有2个答案

燕经国
2023-03-14

您可以为< code>WebClient设置自定义过滤器

WebClient.builder()
    .filter(logRequest())
    .filter(logResponse());


private ExchangeFilterFunction logRequest() {
    return (clientRequest, next) -> {
        log.debug("Request: {} {}", clientRequest.method(), clientRequest.url());
        return next.exchange(clientRequest);
    };
}

private ExchangeFilterFunction logResponse() {
    return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
        log.debug("Response Status: {}", clientResponse.statusCode());
        return Mono.just(clientResponse);
    });
}
梅飞宇
2023-03-14

这就是我创造的。似乎工作正常

statusWebClient.post()
                .uri(url)
                .bodyValue(createTerminalStatusBody(state, msisdn))
                .retrieve()
                .bodyToMono(String.class)
                .subscribeOn(Schedulers.boundedElastic())
                .doOnSuccess(response -> log.debug("Notification was sent to {}, response {}", url, response))
                .doOnError(exception -> log.warn("Failed to send notification to {}, cause {}", url, exception.getMessage()))
                .onErrorResume(throwable -> Mono.empty())
                .subscribe();
 类似资料:
  • 我使用Firebase云消息向我的Android客户端应用发送通知,每个通知都应该根据其注册令牌发送到单个设备。 每次我通过https://fcm.googleapis.com/fcm/send,我收到一个JSON响应,如下所示: 我发现和是多余的——它们不是同一个意思吗?我应该检查两个以确保一切正常吗??

  • 我正在用spring-data-jpa构建一个SpringBoot应用程序。我知道如何从这个问题记录所有的SQL。使用Hibernate时如何打印带有参数值的查询字符串 但如果我只想记录失败的SQL,该怎么办?

  • 我正在从前端客户端向指标微服务发送具有以下数据的 JSON: metrics-microservice目前处理的数据如下: 如您所见,我为每个时间间隔制作了一个新指标。我想知道我是否可以将所有时间间隔放入一个指标中?如果我不必在指标微服务上计算网络时间,而是在Grafana中计算,那就太好了。 另外,我是否可以在注册表.timer中放置成功/失败标记?我假设我需要在每个请求上使用计时器.build

  • 我有一个未来[T],我想在成功和失败上映射结果。 比如说 如果我使用< code>map或< code>flatmap,它将只映射成功的未来。如果我使用< code>recover,它将只映射失败的期货。< code>onComplete执行回调,但不返回修改后的未来值。< code>Transform可以工作,但是需要两个函数而不是一个部分函数,所以有点难看。 我知道我可以做出一个新的,并用或/

  • 我用JQuery 2.0.3这样做http post: json在服务器上发布和编写,但是响应和在AFAIK中没有启用。接收json数据的控制器代码为 我如何还能使成功和失败得到发布的json成功接收或提交失败的回调?它可以提交数据,但是来自服务器的响应不做任何事情,这与控制器方法没有区别,只是用语句写入数据。您是否可以建议一个改进,以便发布数据的javascript也接收响应,我认为如果服务器出

  • 问题内容: 如果我有一个如下所示的SQL表,该如何计算当前的赢或输连胜(以及按季节对赢/输连胜进行分组/重置)。我想更新表并为每条记录填写条纹。 因此,对于#1,条纹将为“ -1”,#2将为“ 1”,#3将为“ 2”,但是一旦我们降至#7,它将再次重置为“ 1”。(+1表示“赢得1场比赛”,-1表示“失去1场比赛”,依此类推。) 问题答案: 对于每个游戏,计算与之前结果相同的游戏,这样就不会有中间