मेरे आवेदन में मैंने वेब सर्विसेज को कॉल करने के लिए रेट्रोफिट लागू किया और मैं इंटरसेप्टर और प्रमाणीकरणकर्ता का उपयोग करने के लिए ओकेएचटीपी का उपयोग कर रहा हूं। कुछ अनुरोधों को token की आवश्यकता है, और मैंने रीफ्रेश को संभालने के लिए प्रमाणीकरण इंटरफ़ेस लागू किया है (आधिकारिक 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;
}
मुद्दा सरल है, पहले अनुरोध सफलतापूर्वक टोकन ताज़ा होगी लेकिन दूसरों को विफल हो गया क्योंकि वे एक टोकन पहले से ही ताजा ताज़ा करने के लिए कोशिश करेंगे। WebService एक त्रुटि 500 लौटाता है। क्या इससे बचने के लिए कोई सुरुचिपूर्ण समाधान है?
धन्यवाद!
यह आपकी मदद कर सकता है, उम्मीद है कि यह बहुत देर हो चुकी है https://stackoverflow.com/a/48518733/8187386 –