如何从 Feign 客户端获取准确的 Rest API 错误

问题描述 投票:0回答:1

我是 Spring Boot 上的 Feign Client 新手,所以请允许我。

我正在尝试使用下面的代码与 Feign Client 进行网络调用

fun validateAccessToken(accessToken: String?): ResponseEntity<ObjectNode> {
        val tokenConfirmationEndpoint = "https://graph.facebook.com"
        val facebookAPIClient = Feign
            .builder()
            .target(FacebookAPIClient::class.java, tokenConfirmationEndpoint)
        val facebookAccessTokenResponse = facebookAPIClient.validateAccessToken(accessToken)
        val body = JSONObject(facebookAccessTokenResponse?.body)
        logger.info("Feign Error $body")
        return responseHandler.errorResponse(facebookAccessTokenResponse?.statusCode?.value() ?: 0, body.toString())
    }

现在,当我故意提供错误的访问令牌来使用 Post Man 测试客户端时,如下所示

请求是http://localhost:8080/validateToken?token=adadadadad

Facebook API 返回一个有效错误,指出

Invalid OAUTH access token
,但 Feign 客户端不是向我提供来自 Facebook 的实际错误消息,而是 Feign 客户端在错误消息前添加一些文本。

这是 Feign Client 返回的错误消息

feign.FeignException$BadRequest: [400 Bad Request] during [GET] to [https://graph.facebook.com/me?access_token=adadadadad] [FacebookAPIClient#validateAccessToken(String)]: [{\"error\":{\"message\":\"Invalid OAuth access token.\",\"type\":\"OAuthException\",\"code\":190,\"fbtrace_id\":\"ApihqZcs6bOyBjCxDgTYklS\"}}]\n\tat feign.FeignException.clientErrorStatus(FeignException.java:213)\n\tat feign.FeignException.errorStatus(FeignException.java:194)\n\tat feign.FeignException.errorStatus(FeignException.java:185)\n\tat feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:92)\n\tat feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:96)\n\tat feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)

但我希望它返回 facebook 的错误,如下所示

{\"error\":{\"message\":\"Invalid OAuth access token.\",\"type\":\"OAuthException\",\"code\":190,\"fbtrace_id\":\"ApihqZcs6bOyBjCxDgTYklS\"}}

仅此而已。

那么,如何让 Feign 客户端从 API 返回准确的消息,并停止在错误前后添加所有 FeignException 文本?

谢谢你

spring-boot kotlin spring-cloud-feign feign openfeign
1个回答
0
投票
new String(((FeignException)ex).responseBody().get().array(), StandardCharsets.UTF_8)
© www.soinside.com 2019 - 2024. All rights reserved.