gpt4 book ai didi

spring - 在 FeignClient 中处理 HTTP 重定向

转载 作者:行者123 更新时间:2023-12-04 12:26:15 25 4
gpt4 key购买 nike

FeignClient 是一个非常漂亮的工具,但不幸的是,如果你需要做一些与 Springs of Spring 预期稍有不同的事情,你就会受到伤害。

当前案例:我使用外部第三方 REST 服务,该服务具有关于 REST 的有趣概念。特别是,如果您向他们发送正确的 JSON,他们会在正文中返回 HTTP 302 和 JSON。

不用说,FeignClient 真的,真的不喜欢这种恶作剧。我的界面:

@FeignClient(value = "someClient", configuration = SomeClientDecoderConfiguration.class)
public interface SomeClient {
@RequestMapping(method = RequestMethod.POST, path = "${someClient.path}",
produces = MediaType.APPLICATION_JSON_VALUE)
JsonOrderCreateResponse orderCreate(JsonOrderCreateRequest request, @RequestHeader("Authorization") String authHeader);
}

我已经有了自定义配置和错误解码器,但这些仅适用于 HTTP 4xx 和 5xx。如果系统遇到 302,结果是这样的:

http://pastebin.com/raw/cGKWc4yg

我如何防止这种情况并强制 FeignClient 像 200 一样处理 302?

最佳答案

虽然没有办法强制 FeignClient 正常处理超过 2xx 的任何事情而没有疯狂的解决方法,但有办法以最小的麻烦来处理它。请注意,您将需要最新版本!我必须在 POM 中输入:

<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.9</version>
</dependency>

那么,该怎么做呢?

在任何方法的伪装客户端实现中,您都需要返回响应。就是这样。

如果您返回响应,框架将以特殊方式运行 - 在状态超过 2xx 的情况下,它不会抛出任何异常,也不会像某些...天才... child 一样尝试多次重试。换句话说, 没有恶作剧 .好极了!

例子:
import feign.Response;

@RequestMapping(method = RequestMethod.POST, path = "${someClient.path}")
Response doThisOrThat(JsonSomeRequest someJson, @RequestHeader("Authorization") String authHeader);

当然,您需要手动实际处理响应(前面提到的最小麻烦):
private JsonSomeResponse resolveResponse(JsonSomeRequest jsonRequest, String accessToken)
{
Response response = someClient.doThisOrThat(jsonRequest, "Bearer " + accessToken);
JsonSomeResponse jsonResponse = null;
String resultBody = "";
try {
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(response.body().asInputStream()))) {
resultBody = buffer.lines().collect(Collectors.joining("\n"));
}
jsonResponse = objectMapper.readValue(resultBody, JsonSomeResponse.class);
} catch (IOException ex) {
throw new RuntimeException("Failed to process response body.", ex);
}
// just an example of using exception
if (response.status() >= 400) thrown new OmgWeAllAreDeadException();
return jsonResponse;
}

然后你可以做任何你想做的事情,检查 response.status() 以抛出你自己的异常,以与 200 相同的方式处理任何状态代码(如 302)的响应(哦,恐怖!)等。

关于spring - 在 FeignClient 中处理 HTTP 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com