2016-07-25 66 views
1

我正在使用Retrofit2向服務器發出請求。Retrofit2 - 全球檢查響應代碼

問題是:有時服務器會爲每個來自用戶的請求返回代碼401。如果用戶得到這些代碼,他應該立即從應用程序中退出(註銷並在重新登錄之前不能做任何事情)。

因此,對於發送到服務器的每個請求,我想檢查服務器是否響應此代碼。在所有的請求調用中寫這個支票並不是很美,所以我只想寫這個支票,而且每次用戶提出請求時都會執行這個支票!

+0

你需要一個Interceptor。你可以閱讀更多關於它[這裏](https://github.com/square/okhttp/wiki/Interceptors) – Blackbelt

回答

2

改造(當前版本)需要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; 
    } 
} 

要使用它,包括它在OkHttpClientRetrofit實例使用:

OkHttpClient client = new OkHttpClient.Builder() 
      .addInterceptor(new ErrorInterceptor()) 
      .build(); 

Retrofit retrofit = new Retrofit.Builder() 
      .client(client) 
      .baseUrl("/") 
      .build(); 

所以,你可以爲每一個 「全球性的邏輯」 或「交叉實施Interceptor - 關注「並將它們全部添加到Retrofit中。

+0

如果守衛是多餘的,不是嗎? – Blackbelt

+0

@Blackbelt只是爲了不打擾200+至300+的狀態代碼。但是,可以刪除。 –

+0

,你也不需要這樣做。最後,你只是拋出401例外,並在其他情況下回應答案 – Blackbelt

1

如果您需要檢查「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; 
    } 
}