首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何处理webclient抛出的异常?

如何处理webclient抛出的异常?
EN

Stack Overflow用户
提问于 2018-10-16 01:18:48
回答 1查看 6.8K关注 0票数 5

无论调用的api返回的错误状态代码是什么,我都在尝试弄清楚如何从api客户端记录异常。

我已经看到了以下实现:

代码语言:javascript
复制
.onStatus(status -> status.value() != HttpStatus.OK.value(),
            rs -> rs.bodyToMono(String.class).map(body -> new IOException(String.format(
                "Response HTTP code is different from 200: %s, body: '%s'", rs.statusCode(), body))))

我见过的另一个例子是使用过滤器。我猜这个过滤器也可以用来记录错误,除了这个例子中的请求:

代码语言:javascript
复制
public MyClient(WebClient.Builder webClientBuilder) {
    webClient = webClientBuilder // you can also just use WebClient.builder()
            .baseUrl("https://httpbin.org")
            .filter(logRequest()) // here is the magic
            .build();
}

但是,我们真的认为没有专门的异常处理程序来处理这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-16 03:35:54

找到了。

如果状态代码是4xx (客户端错误)或5xx (服务器错误),bodyToMono将抛出WebClientException。

服务的全面实施:

代码语言:javascript
复制
@Service
public class FacebookService {
    private static final Logger LOG = LoggerFactory.getLogger(FacebookService.class);
    private static final String URL_DEBUG = "https://graph.facebook.com/debug_token";
    private WebClient webClient;

    public FacebookService() {
        webClient = WebClient.builder()
                .filter(logRequest())
                .build();
    }

    public Mono<DebugTokenResponse> verifyFbAccessToken(String fbAccessToken, String fbAppToken) {
        LOG.info("verifyFacebookToken for " + String.format("fbAccessToken: %s and fbAppToken: %s", fbAccessToken, fbAppToken));
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(URL_DEBUG)
                .queryParam("input_token", fbAccessToken)
                .queryParam("access_token", fbAppToken);
        return this.webClient.get()
                .uri(builder.toUriString())
                .retrieve()
                .bodyToMono(DebugTokenResponse.class);
    }

    private static ExchangeFilterFunction logRequest() {
        return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
            LOG.info("Request: {} {}", clientRequest.method(), clientRequest.url());
            clientRequest.headers().forEach((name, values) -> values.forEach(value -> LOG.info("{}={}", name, value)));
            return Mono.just(clientRequest);
        });
    }

    @ExceptionHandler(WebClientResponseException.class)
    public ResponseEntity<String> handleWebClientResponseException(WebClientResponseException ex) {
        LOG.error("Error from WebClient - Status {}, Body {}", ex.getRawStatusCode(), ex.getResponseBodyAsString(), ex);
        return ResponseEntity.status(ex.getRawStatusCode()).body(ex.getResponseBodyAsString());
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52821765

复制
相关文章

相似问题

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