2015-08-30 11 views
18

Ich möchte alle Antworten durch den Nachrüst-Engine und scannen für HTTP-Fehlercode, zum Beispiel Fehler 403.Retrofit - Intercept Antworten global

Ich bin bewusst, dass ich den Fehler (RetrofitError Fehler verwenden können, erhalten abfangen) Rückruf von jeder Anfrage und prüfen Sie auf 403, aber ich möchte die Antwort global verpacken.

Ich kann sehen, dass Abfrage Interception möglich ist, aber ich sehe keine ähnliche Option für die Antwort.

Irgendwelche Vorschläge?

Antwort

42

Ich konnte das erreichen, indem ich einen OktettClient hinzufüge, den Retrofit benutzt.

Retrofix 2.x:

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); 
    clientBuilder. 
      addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
        Request request = chain.request(); 
        Response response = chain.proceed(request); 
        if (response.code() == 403) { 
         handleForbiddenResponse(); 
        } 
        return response; 
       } 
      }); 


    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(API_BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(clientBuilder.build();) 
      .build(); 

Retrofit 1.x:

public class ForbiddenInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 
     Response response = chain.proceed(request); 
     if (response.code() == 403) { 
      handleForbiddenResponse(); 
     } 
     return response; 
    } 
} 



OkHttpClient okHttpClient = Utils.createUnsafeOkHttpClient(); 
okHttpClient.interceptors().add(new ForbiddenInterceptor()); 

RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder() 
     .setEndpoint(API_BASE_URL) 
     .setClient(new OkClient(okHttpClient)); 
+0

Können Sie erklären, was soll ich für ActivityFragmentInteraction –

+0

verwenden suppoded würde ich gerne wissen, was doStuff() tun könnte sein das ist ein Hintergrund-Thread. – KickingLettuce

+0

Was ist ** RestAdapter ** –

0

Eine andere Möglichkeit ist es, die execute Methode in Retrofit der OkClient außer Kraft zu setzen. In meinem Fall ich war auf der Suche nach einem bestimmten Antwort-Header, so dass es so etwas ging:

OkClient client = new OkClient(okHttpClient) { 
    @Override 
    public retrofit.client.Response execute(retrofit.client.Request request) throws IOException { 
     retrofit.client.Response response = super.execute(request); 

     // Do whatever with 'response', such as looking for the value of a particular header: 

     List<retrofit.client.Header> headers = response.getHeaders(); 
     for (retrofit.client.Header header : headers) { 
      if (MY_HEADER.equalsIgnoreCase(header.getName())) { 
       this.savedValue = header.getValue(); 
       break; 
      } 
     } 

     return response; 
    } 
}; 

RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder() 
     .setEndpoint(API_BASE_URL) 
     .setClient(client);