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

Java Spring启动框架-WebClient日志记录4xx/5xx正文响应

松英喆
2023-03-14

我是Spring Boot framework的WebClient的新手。我如何仅记录4xx/5xx,其错误主体仅在错误上,但如果成功,则将clientResponse作为字符串返回,然后我们可以稍后使用gson对其进行序列化?

java prettyprint-override">
String postResponse =
        post(
            ENDPOINT,
            token,
            request,
            Request.class);

Response response = gson.fromJson(postResponse, Response.class);

    private String post(String endpoint, String token, Mono<?> requestBody, Class<?> requestBodyClass) {

      WebClient.Builder webClientBuilder = WebClient.builder();

      WebClient.RequestBodySpec requestBodySpec = webClientBuilder.build().post().uri(uri);
      requestBodySpec.header(
          "Authorization", BEARER_TOKEN_PREFIX + this.accessTokens.get(token));

      return requestBodySpec
        .header("Content-Type", HEADER_VALUE_CONTENT_TYPE)
        .body(Mono.just(requestBody), requestBodyClass)
        .retrieve()
        .bodyToMono(String.class)
        .block();
    }

共有1个答案

华聪
2023-03-14

我可以提出如下建议:

    private String post(String endpoint, String token, Mono<?> requestBody, Class<?> requestBodyClass) {
        Mono<String> stringMono = WebClient.builder().build()
                .post()
                .uri(endpoint)
                .body(BodyInserters.fromValue(requestBodyClass))
                .exchange()
                .flatMap(SomeServiceImpl::getResultAsStringOrLog4xx5xx);
        
        //get the JSON from the Mono, but you might not want to block
    }

(我省略了标题)

而问题的实际答案是,使用类似的方法执行日志记录:

private static Mono<String> getResultAsStringOrLog4xx5xx(ClientResponse response) {
        if (response.statusCode().is2xxSuccessful()) {
            return response.bodyToMono(String.class);
        } else if (response.statusCode().is5xxServerError()) {
            Logger.error(); //up to you
        } else {
//at this point, you can have your logic on error code
        }
        return
    }

还有其他方法可以做到这一点,希望这可以让你开始。

另外,请不要在应用程序中阻塞()。

非常感谢。

 类似资料:
  • 标题应该是不言自明的。 出于调试目的,我希望express打印每个服务请求的响应代码和正文。打印响应代码很容易,但打印响应体更为复杂,因为响应体似乎不容易作为属性使用。 以下情况不起作用: 当然,我可以很容易地在发出请求的客户端打印响应,但我也更喜欢在服务器端打印。 PS:如果有帮助的话,我所有的响应都是json,但希望有一个解决方案可以处理一般的响应。

  • 我想将我的异常从我的“数据库”REST API重新抛出到我的“后端”REST API,但我丢失了原始异常的消息。 这是我通过Postman从我的“数据库”REST API中得到的: 这部分没问题。 这是我通过Postman从我的“后端”REST API得到的: 如您所见,原来的“message”字段丢失了。 我使用: Spring boot 2.2.5.发布 spring-boot-starter

  • 我正在使用Spring WebClient下载文件,如下所示: 文件下载得很好。我唯一挣扎的是,当响应为200时,我只想像这样记录一行: 我也试过了,但没有得到我想要的-如何记录Spring WebClient响应 简而言之,是否有某种方法可以在不编写单独的的情况下实现上述目标?在这里感到迷失和无知。这方面的任何指针都将受到高度赞赏。

  • 看过本章第一节的同学应该还记得,log_by_lua* 是一个请求经历的最后阶段。由于记日志跟应答内容无关,Nginx 通常在结束请求之后才更新访问日志。由此可见,如果我们有日志输出的情况,最好统一到 log_by_lua* 阶段。如果我们把记日志的操作放在 content_by_lua* 阶段,那么将线性的增加请求处理时间。 在公司某个定制化项目中,Nginx 上的日志内容都要输送到 syslo

  • 我刚刚为我们的微服务环境在前端创建了简单的Zuul代理,但现在我想将所有条目记录到通过代理的日志文件中。 做任何我需要做的事情。

  • 问题内容: 我在Spring 3.5容器中将JpaTransactionManager与hibernate3一起使用。我无法为JPA启用日志记录。我希望看到用于调试我的某些服务的事务管理日志。我正在使用log4j。 这是我的log4j.properties中的内容 问题答案: 在启用JPATransactionManager的日志记录方面,这对我有用:1.下载logback jar(logback