Pytanie Dodanie nagłówka do wszystkich żądań z Retrofit 2


Dokumentacja Retrofit 2 mówi:

Nagłówki, które należy dodać do każdego żądania, można określić za pomocą przechwytywacza OkHttp.

Można to zrobić łatwo, używając poprzedniej wersji, oto jest powiązana kontrola jakości.

Ale używając retrofitu 2, nie mogłem znaleźć czegoś takiego setRequestInterceptor lub setInterceptor metoda, do której można zastosować Retrofit.Builder obiekt.

Wydaje się również, że nie ma RequestInterceptor w OkHttp już. Dokument Retrofit odnosi nas do Interceptor że nie bardzo rozumiałem, jak go używać w tym celu.

Jak mogę to zrobić?


76
2017-09-16 10:12


pochodzenie




Odpowiedzi:


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



W wersji retrofit2-beta3 jest nieco inaczej. Spójrz tutaj: stackoverflow.com/questions/34973432/... - Ashkan Sarlak
Jak możemy potwierdzić, że te nagłówki są wysyłane. Kiedy debuguję połączenie enqueue Nie widzę domyślnych nagłówków. - viper
Powinno być new OkHttpClient.Builder() zamiast new OkHttpClient() - Wojtek


Najnowsza wersja Retrofit TUTAJ -> 2.1.0.

Wersja lambda:

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

brzydka długa wersja:

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

pełna wersja:

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

plik gradle (musisz dodać przechwytywacz rejestrowania, jeśli planujesz go użyć):

  //----- 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





Do rejestrowania żądania i odpowiedzi potrzebny jest przechwytywacz, a także do ustawiania nagłówka potrzebny jest przechwytywacz. Oto rozwiązanie polegające na dodaniu jednocześnie przechwytywacza za pomocą modernizacji 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;

    }

Teraz w swoim obiekcie modernizacyjnym dodaj ten nagłówek do klienta

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

9
2017-08-23 07:27





W moim przypadku addInterceptor()nie działało, aby dodać nagłówki HTTP do mojej prośby, musiałem użyć addNetworkInterceptor(). Kod jest następujący:

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

I kod przechwytywania:

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

To i więcej przykładów na ten sens


3
2017-08-11 12:04





Jeśli użyjesz metody addInterceptor do dodania HttpLoggingInterceptor, nie będzie ona rejestrować rzeczy dodanych przez inne obiekty przechwytujące zastosowane później niż HttpLoggingInterceptor.

Na przykład: jeśli masz dwa przechwytywacze "HttpLoggingInterceptor" i "AuthInterceptor", a HttpLoggingInterceptor zastosowany jako pierwszy, to nie może wyświetlać parametrów HTTP lub nagłówków ustawionych przez AuthInterceptor.

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

Rozwiązałem go, używając metody addNetworkInterceptor.


2
2018-06-30 12:47



Możesz także dodać HttpLoggingInterceptor jako ostatni przechwytujący, aby zobaczyć ostateczną prośbę. - Micer


Znalazłem inny sposób na Retrofit 1.9 i 2.0, dla Json Content Type.

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

Możesz dodać wiele innych nagłówków, np

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

1
2018-03-27 19:11