2015-10-06 21 views
51

Nhóm của chúng tôi quyết định áp dụng Trang bị thêm 2.0 và tôi đang thực hiện một số nghiên cứu ban đầu về nó. Tôi là một newbie để thư viện này và hy vọng sẽ nhận được một số sự giúp đỡ từ cộng đồng :)Cách sử dụng trình chặn để thêm Tiêu đề trong trang bị thêm 2.0

Như đã nêu trong tiêu đề, tôi đang tự hỏi làm thế nào để sử dụng interceptor để thêm tiêu đề tùy chỉnh thông qua retrofits 2.0 trong ứng dụng Android của chúng tôi . Có rất nhiều tutorials về cách sử dụng interceptor để thêm tiêu đề trong trang bị thêm 1.X, nhưng vì các API đã thay đổi rất nhiều trong phiên bản mới nhất, tôi không chắc chắn cách điều chỉnh các phương thức đó trong phiên bản mới. Ngoài ra, Retrofit vẫn chưa cập nhật tài liệu mới của nó.

Ví dụ: trong các mã sau, tôi nên triển khai lớp học Interceptor để thêm tiêu đề bổ sung như thế nào? Bên cạnh đó, chính xác những gì là undocumented Chain object? Khi nào thì intercept() được gọi?

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(); 

Có ai có thể chia sẻ một số ý tưởng về vấn đề này không?

Cảm ơn !!

+1

Hãy chắc chắn rằng BASE_API_URL của bạn kết thúc với '/' và url API của bạn không (' stuff/post/whatever') – EpicPandaForce

Trả lời

60

Kiểm tra điều này.

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

Cảm ơn !! Vì vậy, 'đánh chặn() 'này được kích hoạt mỗi khi một yêu cầu được gửi từ ứng dụng? Chúng ta có thể nắm bắt phản ứng trung gian cho chuyển hướng hay chúng ta chỉ nhận được phản hồi cuối cùng? – hackjutsu

+0

Điều này được gọi cho mọi yêu cầu, và nếu tôi biết đúng, đó là bởi vì bạn thêm nó như là một kẻ đánh chặn, và không phải là một kẻ đánh chặn mạng. Tôi nghĩ bạn chỉ có thể nhận được phản hồi cuối cùng ở đây, nhưng có thể có một cấu hình để cho phép xem chuyển hướng dưới dạng chuyển hướng mà tôi không biết ngoài đầu của tôi (cũng có một cho kết nối URL http.) – EpicPandaForce

+1

Chỉ cần tham khảo liên kết này: https://github.com/square/okhttp/wiki/Interceptors và nhận thông tin tôi cần :) Cảm ơn bạn ~ – hackjutsu

15

Một lựa chọn khác từ 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

Tốt đẹp! Vì vậy, 'request.newBuilder(). Tiêu đề (moreHeaders) .build()' sẽ giữ các tiêu đề ban đầu? – hackjutsu

+1

Có. Không có tiêu đề nào bị xóa khỏi yêu cầu trừ khi [removeAll (String name)] (http://square.github.io/okhttp/javadoc/com/squareup/okhttp/Headers.Builder.html#removeAll-java.lang.String-) được gọi là. – VenomVendor

+0

@VenomVendor xin vui lòng giúp tôi với một câu hỏi tương tự ở đây https://stackoverflow.com/questions/45078720/dagger-generating-multiple-instances-of-retrofit-interceptor thanks – 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

Bạn có thể sử dụng tiêu đề đánh chặn với các phương pháp tích hợp của nó như thế này

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); 
     } 
    }); 
} 
Các vấn đề liên quan