私のアプリケーションでは、WebServicesを呼び出すためにRetrofitを実装しました。また、InterceptorとAuthenticatorを使用するためにOkHttpを使用しています。一部のリクエストにはtokenが必要です。認証コードを入力してください(documentationに従う)。しかし、私は次の問題を抱えています。私のアプリでは、一度に複数のリクエストを呼び出す必要があります。そのため、そのうちの1つでは、401エラーが発生します。ここでOkHttpとRetrofit、並行要求を使用してトークンをリフレッシュ
は、要求のための私のコードで呼び出します。問題は簡単です
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;
}
、最初の要求が正常にトークンを更新しますが、彼らはすでに、リフレッシュトークンをリフレッシュしようとするので、他の人が失敗します。 WebServiceはエラー500を返します。これを避けるための洗練されたソリューションはありますか?
ありがとうございました!
これはあなたに役立つかもしれませんが、遅すぎることはありませんhttps://stackoverflow.com/a/48518733/8187386 –