2015-10-06 14 views
51

Unser Team beschließen, Retrofit 2.0 zu adoptieren, und ich mache ein paar Nachforschungen darüber. Ich bin ein Neuling in dieser Bibliothek und hoffen, dass etwas Hilfe aus der Community zu bekommen :)Verwendung von Interceptor zum Hinzufügen von Kopfzeilen in Retrofit 2.0

Wie im Titel erwähnt, ich frage mich, wie interceptor verwenden, um benutzerdefinierte Header über Retrofits 2.0 in unserer Android App hinzufügen . Es gibt viele tutorials über die Verwendung von interceptor, um Header in Retrofit 1.X hinzufügen, aber da die APIs in der neuesten Version viel geändert haben, bin ich nicht sicher, wie diese Methoden in der neuen Version anzupassen. Außerdem hat Retrofit seine neue Dokumentation noch nicht aktualisiert.

Zum Beispiel in den folgenden Codes, wie sollte ich die Interceptor Klasse implementieren, um zusätzliche Header hinzuzufügen? Außerdem, was genau ist die undocumented Chain object? Wann wird die intercept() aufgerufen werden?

OkHttpClient client = new OkHttpClient(); 
    client.interceptors().add(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Response response = chain.proceed(chain.request()); 

      // How to add extra headers? 

      return response; 
     } 
    }); 

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

Könnte jemand eine Idee zu diesem Thema teilen?

Danke !!

+1

Stellen Sie sicher, Ihre BASE_API_URL endet mit '/' und dass Ihre API (' Zeug/Post/was auch immer ") – EpicPandaForce

Antwort

60

Überprüfen Sie dies.

public class HeaderInterceptor 
     implements Interceptor { 
    @Override 
    public Response intercept(Chain chain) 
      throws IOException { 
     Request request = chain.request(); 
     request = request.newBuilder() 
       .addHeader("appid", "hello") 
       .addHeader("deviceplatform", "android") 
       .removeHeader("User-Agent") 
       .addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0") 
       .build(); 
     Response response = chain.proceed(request); 
     return response; 
    } 
} 
+0

Danke !! Also, dieses 'intercept()' wird jedes Mal ausgelöst, wenn eine Anfrage von der Anwendung gesendet wird? Können wir die Zwischenantwort für die Umleitung abfangen, oder erhalten wir nur die endgültige Antwort? – hackjutsu

+0

Dies wird für jede Anfrage aufgerufen, und wenn ich es richtig weiß, liegt es daran, dass Sie es als Interceptor und nicht als Netzwerkinterceptor hinzufügen. Ich denke, Sie können hier nur die endgültige Antwort erhalten, aber es könnte eine Konfiguration geben, um Weiterleitungen als Weiterleitungen zu sehen, die ich nicht von Anfang an kenne (es gibt auch eine für die http-URL-Verbindung.) – EpicPandaForce

+1

Siehe auch diesen Link: https://github.com/square/okhttp/wiki/Interceptors, und erhalten Sie die Informationen, die ich brauche :) Danke ~ – hackjutsu

15

Eine weitere Alternative der auf Android Eintrag accepted answer

public class HeaderInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 

     request = request.newBuilder() 
       .addHeader("headerKey0", "HeaderVal0") 
       .addHeader("headerKey0", "HeaderVal0--NotReplaced/NorUpdated") //new header added 
       .build(); 

     //alternative 
     Headers moreHeaders = request.headers().newBuilder() 
       .add("headerKey1", "HeaderVal1") 
       .add("headerKey2", "HeaderVal2") 
       .set("headerKey2", "HeaderVal2--UpdatedHere") // existing header UPDATED if available, else added. 
       .add("headerKey3", "HeaderKey3") 
       .add("headerLine4 : headerLine4Val") //line with `:`, spaces doesn't matter. 
       .removeAll("headerKey3") //Oops, remove this. 
       .build(); 

     request = request.newBuilder().headers(moreHeaders).build(); 

     /* ##### List of headers ##### */ 
     // headerKey0: HeaderVal0 
     // headerKey0: HeaderVal0--NotReplaced/NorUpdated 
     // headerKey1: HeaderVal1 
     // headerKey2: HeaderVal2--UpdatedHere 
     // headerLine4: headerLine4Val 

     Response response = chain.proceed(request); 
     return response; 
    } 
} 
+0

Schön! Also 'request.newBuilder(). Headers (moreHeaders) .build()' behält die ursprünglichen Header? – hackjutsu

+1

Ja. Es werden keine Header aus der Anforderung entfernt, es sei denn, [removeAll (String name)] (http://square.github.io/okhttp/javadoc/com/squadeup/okhttp/Headers.Builder.html#removeAll-java.lang.String-) wird genannt. – VenomVendor

+0

@VenomVendor mit einer ähnlichen Frage bitte helfen Sie mir hier https://stackoverflow.com/questions/45078720/dagger-generating-multiple-instances-of-retrofit-interceptor dank – user606669

3
public class ServiceFactory { 
    public static ApiClient createService(String authToken, String userName, String password) { 
      OkHttpClient defaultHttpClient = new OkHttpClient.Builder() 
        .addInterceptor(
          chain -> { 
           Request request = chain.request().newBuilder() 
             .headers(getJsonHeader(authToken)) 
             .build(); 
           return chain.proceed(request); 
          }) 
        .authenticator(getBasicAuthenticator(userName, password)) 
        .build(); 
      return getService(defaultHttpClient); 
     } 
     private static Headers getJsonHeader(String authToken) { 
      Headers.Builder builder = new Headers.Builder(); 
      builder.add("Content-Type", "application/json"); 
      builder.add("Accept", "application/json"); 
      if (authToken != null && !authToken.isEmpty()) { 
       builder.add("X-MY-Auth", authToken); 
      } 
      return builder.build(); 
     } 
     private static Authenticator getBasicAuthenticator(final String userName, final String password) { 
      return (route, response) -> { 
       String credential = Credentials.basic(userName, password); 
       return response.request().newBuilder().header("Authorization", credential).build(); 
      }; 
     } 
      private static ApiClient getService(OkHttpClient defaultHttpClient) { 
      return new Retrofit.Builder() 
        .baseUrl(BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
        .client(defaultHttpClient) 
        .build() 
        .create(ApiClient.class); 
     } 
} 
0

Sie können Header Interceptor mit seiner integrierten Methoden wie diese Urls nicht

interceptors().add(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request original = chain.request(); 

      Request.Builder builder = original.newBuilder(); 

      builder.header("Authorization","Bearer "+ LeafPreference.getInstance(context).getString(LeafPreference.TOKEN)); 

      Request request = builder.method(original.method(), original.body()) 
        .build(); 
      Log.e("request",request.urlString()); 
      Log.e("header",request.header("Authorization")); 
      return chain.proceed(request); 
     } 
    }); 
} 
Verwandte Themen