Câu hỏi Thêm tiêu đề cho tất cả yêu cầu với Retrofit 2


Tài liệu của Retrofit 2 nói:

Các tiêu đề cần được thêm vào mọi yêu cầu có thể được chỉ định bằng cách sử dụng trình chặn chặn OkHttp.

Nó có thể được thực hiện dễ dàng bằng cách sử dụng phiên bản trước, ở đây QA có liên quan.

Nhưng sử dụng trang bị thêm 2, tôi không thể tìm thấy thứ gì đó như setRequestInterceptor hoặc là setInterceptor phương pháp có thể được áp dụng cho Retrofit.Builder vật.

Có vẻ như không có RequestInterceptor trong OkHttp nữa không. Tài liệu của Retrofit đề cập đến chúng tôi Interceptor tôi không hoàn toàn hiểu cách sử dụng nó cho mục đích này.

Tôi có thể làm cái này như thế nào?


76
2017-09-16 10:12


gốc




Các câu trả lời:


OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

httpClient.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request().newBuilder().addHeader("parameter", "value").build();
        return chain.proceed(request);
    }
});
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(url).client(httpClient.build()).build();

123
2017-09-16 11:05



Trong phiên bản retrofit2-beta3, nó hơi khác một chút. Xem ở đây: stackoverflow.com/questions/34973432/… - Ashkan Sarlak
Làm cách nào chúng tôi có thể xác nhận rằng các tiêu đề này được gửi đi. Khi tôi gỡ lỗi khi gọi enqueue Tôi không thể thấy các tiêu đề mặc định. - viper
Nó phải là new OkHttpClient.Builder() thay thế new OkHttpClient() - Wojtek


Phiên bản Retrofit mới nhất TẠI ĐÂY -> 2.1.0.

phiên bản lambda:

  builder.addInterceptor(chain -> {
    Request request = chain.request().newBuilder().addHeader("key", "value").build();
    return chain.proceed(request);
  });

phiên bản dài xấu xí:

  builder.addInterceptor(new Interceptor() {
    @Override public Response intercept(Chain chain) throws IOException {
      Request request = chain.request().newBuilder().addHeader("key", "value").build();
      return chain.proceed(request);
    }
  });

phiên bản đầy đủ:

class Factory {

public static APIService create(Context context) {

  OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
  builder.readTimeout(10, TimeUnit.SECONDS);
  builder.connectTimeout(5, TimeUnit.SECONDS);

  if (BuildConfig.DEBUG) {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
    builder.addInterceptor(interceptor);
  }

  builder.addInterceptor(chain -> {
    Request request = chain.request().newBuilder().addHeader("key", "value").build();
    return chain.proceed(request);
  });

  builder.addInterceptor(new UnauthorisedInterceptor(context));
  OkHttpClient client = builder.build();

  Retrofit retrofit =
      new Retrofit.Builder().baseUrl(APIService.ENDPOINT).client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();

  return retrofit.create(APIService.class);
  }
}

tệp gradle (bạn cần phải thêm trình chặn chặn ghi nhật ký nếu bạn dự định sử dụng nó):

  //----- Retrofit
  compile 'com.squareup.retrofit2:retrofit:2.1.0'
  compile "com.squareup.retrofit2:converter-gson:2.1.0"
  compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"
  compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'

54
2018-01-26 21:23





Để ghi lại yêu cầu và phản hồi của bạn, bạn cần một bộ chặn và cũng để thiết lập tiêu đề bạn cần một bộ chặn, đây là giải pháp để thêm cả bộ chặn lẫn một lúc bằng cách sử dụng trang bị thêm 2.1

 public OkHttpClient getHeader(final String authorizationValue ) {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient okClient = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .addNetworkInterceptor(
                        new Interceptor() {
                            @Override
                            public Response intercept(Interceptor.Chain chain) throws IOException {
                                Request request = null;
                                if (authorizationValue != null) {
                                    Log.d("--Authorization-- ", authorizationValue);

                                    Request original = chain.request();
                                    // Request customization: add request headers
                                    Request.Builder requestBuilder = original.newBuilder()
                                            .addHeader("Authorization", authorizationValue);

                                    request = requestBuilder.build();
                                }
                                return chain.proceed(request);
                            }
                        })
                .build();
        return okClient;

    }

Bây giờ trong đối tượng retrofit của bạn thêm tiêu đề này trong máy khách

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(getHeader(authorizationValue))
                .addConverterFactory(GsonConverterFactory.create())
                .build();

9
2017-08-23 07:27





Trong trường hợp của tôi addInterceptor()không hoạt động để thêm tiêu đề HTTP vào yêu cầu của tôi, tôi đã phải sử dụng addNetworkInterceptor(). Mã số như sau:

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addNetworkInterceptor(new AddHeaderInterceptor());

Và mã chặn:

public class AddHeaderInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {

        Request.Builder builder = chain.request().newBuilder();
        builder.addHeader("Authorization", "MyauthHeaderContent");

        return chain.proceed(builder.build());
    }
}

Điều này và nhiều ví dụ khác về gist này


3
2017-08-11 12:04





Nếu bạn sử dụng phương thức addInterceptor để thêm HttpLoggingInterceptor, nó sẽ không ghi lại những thứ được thêm bởi các trình chặn khác được áp dụng sau HttpLoggingInterceptor.

Ví dụ: Nếu bạn có hai trình chặn "HttpLoggingInterceptor" và "AuthInterceptor" và HttpLoggingInterceptor được áp dụng trước, thì bạn không thể xem các tham số http hoặc các tiêu đề do AuthInterceptor đặt.

OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addNetworkInterceptor(logging)
.addInterceptor(new AuthInterceptor());

Tôi đã giải quyết nó bằng cách sử dụng phương thức addNetworkInterceptor.


2
2018-06-30 12:47



Bạn cũng có thể thêm HttpLoggingInterceptor là kẻ đánh chặn cuối cùng để xem yêu cầu cuối cùng. - Micer


Tôi tìm thấy một cách khác cho Retrofit 1.9 và 2.0, Đối với loại nội dung Json.

@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

Bạn có thể thêm nhiều Tiêu đề khác

@Headers({
        "Accept: application/json",
        "User-Agent: Your-App-Name",
        "Cache-Control: max-age=640000"
    })

1
2018-03-27 19:11