我正在使用Retrofit2向服務器發出請求。Retrofit2 - 全球檢查響應代碼
問題是:有時服務器會爲每個來自用戶的請求返回代碼401。如果用戶得到這些代碼,他應該立即從應用程序中退出(註銷並在重新登錄之前不能做任何事情)。
因此,對於發送到服務器的每個請求,我想檢查服務器是否響應此代碼。在所有的請求調用中寫這個支票並不是很美,所以我只想寫這個支票,而且每次用戶提出請求時都會執行這個支票!
我正在使用Retrofit2向服務器發出請求。Retrofit2 - 全球檢查響應代碼
問題是:有時服務器會爲每個來自用戶的請求返回代碼401。如果用戶得到這些代碼,他應該立即從應用程序中退出(註銷並在重新登錄之前不能做任何事情)。
因此,對於發送到服務器的每個請求,我想檢查服務器是否響應此代碼。在所有的請求調用中寫這個支票並不是很美,所以我只想寫這個支票,而且每次用戶提出請求時都會執行這個支票!
改造(當前版本)需要HTTP客戶端發出請求。同一開發人員的OkHttp library與作爲默認客戶端的Retrofit捆綁在一起。 OkHttp
支持將Interceptor
添加到可攔截請求執行的客戶端。
例如:
import android.util.Log;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class ErrorInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
// before request
Request request = chain.request();
// execute request
Response response = chain.proceed(request);
// after request
// inspect status codes of unsuccessful responses
switch (response.code()){
case 401:
// do something else
Log.e("TEST","Unauthorized error for: " +request.url());
// perhaps throw a custom exception ?
throw new IOException("Unauthorized !!");
}
return response;
}
}
要使用它,包括它在OkHttpClient
是Retrofit
實例使用:
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new ErrorInterceptor())
.build();
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl("/")
.build();
所以,你可以爲每一個 「全球性的邏輯」 或「交叉實施Interceptor
- 關注「並將它們全部添加到Retrofit中。
如果您需要檢查「401」代碼,OkHttp中有特殊的對象:Authenticator(Recipes in OkHttp)。例如:
public class RefreshTokenAuthenticator implements Authenticator {
@Override
public Request authenticate(Route route, Response response) throws IOException {
// You get here, if response code was 401.
// Then you can somehow change your request or data in your app in this method and resend your request.
Request request = response.request();
HttpUrl url = request.url().newBuilder()
.setQueryParameter("access_token", "new_access_token_may_be")
.build();
request = request.newBuilder()
.url(url)
.build();
return request;
}
}
你需要一個Interceptor。你可以閱讀更多關於它[這裏](https://github.com/square/okhttp/wiki/Interceptors) – Blackbelt