Uygulamamda WebServices'ı aramak için Retrofit'i uyguladım ve Interceptor ve Authenticator'ı kullanmak için OkHttp kullanıyorum. Bazı isteklerin token'a ihtiyacı var ve yenilemeyi yönetmek için Authenticator arabirimini uyguladım (resmi documentation'u izleyerek). Ancak şu sorunum var: Uygulamamda zaman zaman birden fazla isteği tek seferde aramak zorundayım. Bundan dolayı, bunlardan biri için 401 hatasını alacağım.OkHttp ve Güçlendirme, eşzamanlı isteklerle yenileme belirteci
İşte istek aramalar için benim kodudur:
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;
}
mesele basit, ilk istek başarıyla belirteci yenilenir ancak bir belirteç zaten tazelenmiş yenilemek için çalışacaktır çünkü başkalarının başarısız olacaktır. WebService 500 hatası veriyor. Bunu önlemek için herhangi bir zarif çözüm var mı?
Teşekkür ederiz!
Bu size yardımcı olabilir, umarım çok geç değildir https://stackoverflow.com/a/48518733/8187386 –