gpt4 book ai didi

java - 使用新的请求拦截器伪造客户端重试器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:23 24 4
gpt4 key购买 nike

我目前正在手动构建一个假装客户端并将拦截器传递给它进行授权。我想要一个更智能的重试器来处理一些响应代码。

public class myErrorEncoder extends ErrorDecoder.Default {

@Override
public Exception decode(final String methodKey, final Response response) {
if (response.status() == 401) {
String token = refreshToken(); // I would like to refresh the token and Edit the client
return new RetryableException("Token Expired will retry it", null);
} else {
return super.decode(methodKey, response);
}
}

拦截器

@Bean public CustomInterceptor getInterceptor(String token) {
return new CustomInterceptor(token);}

假装生成器

 private <T> T feignBuild(final Class<T> clazz, final String uri, final String token) {
return Feign
.builder().client(new ApacheHttpClient())
.encoder(new GsonEncoder())
.decoder(new ResponseEntityDecoder(feignDecoder())
.retryer(new Retryer.Default(1,100,3))
.errorDecoder(new ErrorDecoder())
.requestInterceptor(getInterceptor(token))
.contract(new ClientContract())
.logger(new Slf4jLogger(clazz)).target(clazz, uri);
}

现在我想用刷新的 token 更新 feign 客户端并重试。有没有办法访问客户端实例并对其进行配置。

最佳答案

您对拦截器的使用不正确。拦截器在重试期间被重新应用,但它们只被实例化一次并且应该是线程安全的。要实现您正在寻找的目标,需要将 token 生成与拦截器分开,并让拦截器请求一个新 token 。

public class TokenInterceptor() {
TokenService tokenService;

public TokenInterceptor(TokenService tokenService) {
this.tokenService = tokenService;
}

public void apply(RequestTemplate template) {
/* getToken() should create a new token */
String token = this.tokenService.getToken();
template.header("Authorization", "Bearer " + token);
}
}

这将确保每个重试周期都创建一个新 token 。

关于java - 使用新的请求拦截器伪造客户端重试器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53500757/

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