gpt4 book ai didi

android - OkHttp 和 Retrofit,并发请求刷新 token

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:34 24 4
gpt4 key购买 nike

在我的应用程序中,我实现了 Retrofit 来调用 WebServices,并且我使用 OkHttp 来使用拦截器和验证器。有些请求需要 token ,我已经实现了 Authenticator 接口(interface)来处理刷新(遵循官方 documentation )。但我有以下问题:在我的应用程序中,有时我必须一次调用多个请求。因此,对于其中一个,我将遇到 401 错误。

这是我的请求调用代码:

public static <S> S createServiceAuthentication(Class<S> serviceClass, boolean hasPagination) {

final String jwt = JWT.getJWTValue(); //Get jwt value from Realm

if (hasPagination) {
Gson gson = new GsonBuilder().
registerTypeAdapter(Pagination.class, new PaginationTypeAdapter()).create();

builder =
new Retrofit.Builder()
.baseUrl(APIConstant.API_URL)
.addConverterFactory(GsonConverterFactory.create(gson));
}

OkHttpClient.Builder httpClient =
new OkHttpClient.Builder();

httpClient.addInterceptor(new AuthenticationInterceptor(jwt));
httpClient.authenticator(new Authenticator() {
@Override
public Request authenticate(Route route, Response response) throws IOException {
if (responseCount(response) >= 2) {
// If both the original call and the call with refreshed token failed,
// it will probably keep failing, so don't try again.
return null;
}

if (jwt.equals(response.request().header("Authorization"))) {
return null; // If we already failed with these credentials, don't retry.
}

APIRest apiRest = createService(APIRest.class, false);
Call<JWTResponse> call = apiRest.refreshToken(new JWTBody(jwt));
try {
retrofit2.Response<JWTResponse> refreshTokenResponse = call.execute();
if (refreshTokenResponse.isSuccessful()) {

JWT.storeJwt(refreshTokenResponse.body().getJwt());

return response.request().newBuilder()
.header(CONTENT_TYPE, APPLICATION_JSON)
.header(ACCEPT, APPLICATION)
.header(AUTHORIZATION, "Bearer " + refreshTokenResponse.body().getJwt())
.build();
} else {
return null;
}
} catch (IOException e) {
return null;
}
}
});

builder.client(httpClient.build());
retrofit = builder.build();

return retrofit.create(serviceClass);
}

private static int responseCount(Response response) {
int result = 1;
while ((response = response.priorResponse()) != null) {
result++;
}
return result;
}

问题很简单,第一个请求会成功刷新 token ,但其他请求会失败,因为它们会尝试刷新已经刷新的 token 。 WebService 返回错误 500。是否有任何优雅的解决方案可以避免这种情况?

谢谢!

最佳答案

如果我理解你的问题,在更新 token 时发送了一些请求,这会给你一个错误。

您可以尝试在更新 token (使用“同步”对象)时阻止所有请求,但这不会涵盖已发送请求的情况。

由于这个问题很难完全避免,也许这里正确的做法是有一个良好的回退行为。例如,通过使用更新后的 token 重新运行请求来处理在 token 更新期间发出请求时遇到的错误。

关于android - OkHttp 和 Retrofit,并发请求刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44386722/

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