首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Spring Boot框架- WebClient日志记录4xx/5xx主体响应

Java Spring Boot框架- WebClient日志记录4xx/5xx主体响应
EN

Stack Overflow用户
提问于 2020-10-28 09:06:59
回答 1查看 144关注 0票数 1

我刚接触Spring Boot框架的WebClient。如何仅在出错时记录4xx/5xx及其错误主体,但如果成功,则将clientResponse作为String返回,稍后我们可以使用gson对其进行序列化?

代码语言:javascript
复制
String postResponse =
        post(
            ENDPOINT,
            token,
            request,
            Request.class);

Response response = gson.fromJson(postResponse, Response.class);
代码语言:javascript
复制
    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();
    }
EN

回答 1

Stack Overflow用户

发布于 2020-10-28 10:07:48

我可以这样建议:

代码语言:javascript
复制
    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
    }

(我省略了标题)

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

代码语言:javascript
复制
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
    }

还有其他方法可以做到这一点,希望这能帮助你入门。

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

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64565064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档