Retrofit 2 ile tüm talebe başlık ekleme


130

Retrofit 2'nin belgeleri şunları söylüyor:

Her isteğe eklenmesi gereken başlıklar, bir OkHttp engelleyicisi kullanılarak belirtilebilir.

Önceki sürümü kullanarak kolayca yapılabilir, işte ilgili QA.

Ancak retrofit 2'yi kullanarak, nesneye uygulanabilecek bir şey setRequestInterceptorveya setInterceptoryöntem bulamadım Retrofit.Builder.

Ayrıca hiçbir sahip gibi görünüyor RequestInterceptoriçinde OkHttp artık. Retrofit belgesi, bizi bu amaçla nasıl kullanacağımı tam olarak anlamadığım Interceptor'a yönlendiriyor.

Bunu nasıl yapabilirim?

Yanıtlar:


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

5
Retrofit2-beta3 versiyonunda durum biraz farklı. Buraya bakın: stackoverflow.com/questions/34973432/…
Ashkan Sarlak

Bu başlıkların gönderildiğini nasıl teyit edebiliriz. Çağrıda hata ayıkladığımda enqueuevarsayılan başlıkları göremiyorum.
viper

Bunun new OkHttpClient.Builder()yerine olmalınew OkHttpClient()
Wojtek

80

BURADA En Son Retrofit Sürümü -> 2.1.0.

lambda versiyonu:

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

çirkin uzun versiyon:

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

tam versiyon:

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

gradle dosyası (kullanmayı planlıyorsanız, günlük yakalayıcısını eklemeniz gerekir):

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

13

İsteğinizi ve yanıtınızı günlüğe kaydetmek için bir durdurucuya ihtiyacınız vardır ve ayrıca başlığı ayarlamak için bir durdurucuya ihtiyacınız vardır, İşte iyileştirme 2.1'i kullanarak her iki durdurucuyu aynı anda eklemek için çözüm

 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;

    }

Şimdi retrofit nesnenize bu başlığı istemciye ekleyin

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

12

Retrofit 1.9 ve 2.0 için bu tip başlığı deneyin. Json İçerik Türü için.

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

Çok daha fazla başlık ekleyebilirsiniz yani

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

Dinamik Olarak Başlıklara Ekle:

@POST("user/classes")
Call<ResponseModel> addToPlaylist(@Header("Content-Type") String content_type, @Body RequestModel req);

Yani seni yöntemini çağır

mAPI.addToPlayList("application/json", playListParam);

Veya

Her seferinde geçmek ve ardından http Interceptor ile HttpClient nesnesi oluşturmak istiyorsanız:

OkHttpClient httpClient = new OkHttpClient();
        httpClient.networkInterceptors().add(new Interceptor() {
            @Override
            public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
                Request.Builder requestBuilder = chain.request().newBuilder();
                requestBuilder.header("Content-Type", "application/json");
                return chain.proceed(requestBuilder.build());
            }
        });

Ardından güçlendirme nesnesine ekleyin

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();

GÜNCELLEME Kotlin kullanıyorsanız, { }işe yaramayacak başka bir şeyi kaldırın


2
Arayüzdeki tüm istekler için onu çoğaltmadan nasıl bir başlık oluşturulur?
Evgenii Vorobei

Bunu HTTP Günlüğe Kaydetme engelleyicisine eklemelisiniz
Avinash Verma

6

Benim durumumda addInterceptor()isteğime HTTP başlıkları eklemek işe yaramadı, kullanmak zorunda kaldım addNetworkInterceptor(). Kod aşağıdaki gibidir:

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

Ve durdurucu kodu:

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

Bu ve bu özle ilgili daha fazla örnek


5

HttpLoggingInterceptor eklemek için addInterceptor yöntemini kullanırsanız, HttpLoggingInterceptor'dan sonra uygulanan diğer önleyiciler tarafından eklenen şeyleri günlüğe kaydetmez.

Örneğin: İki durdurucunuz varsa "HttpLoggingInterceptor" ve "AuthInterceptor" ve ilk olarak HttpLoggingInterceptor uygulandıysa, AuthInterceptor tarafından ayarlanan http parametrelerini veya başlıklarını görüntüleyemezsiniz.

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

AddNetworkInterceptor yöntemini kullanarak çözdüm.


1
HttpLoggingInterceptorSon isteği görmek için son durdurucu olarak da ekleyebilirsiniz .
Micer

2

Bu Retrofit İstemcisini kullanın

class RetrofitClient2(context: Context) : OkHttpClient() {

    private var mContext:Context = context
    private var retrofit: Retrofit? = null

    val client: Retrofit?
        get() {
            val logging = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)

            val client = OkHttpClient.Builder()
                    .connectTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
                    .readTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
                    .writeTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
            client.addInterceptor(logging)
            client.interceptors().add(AddCookiesInterceptor(mContext))

            val gson = GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create()
            if (retrofit == null) {

                retrofit = Retrofit.Builder()
                        .baseUrl(Constants.URL)
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .client(client.build())
                        .build()
            }
            return retrofit
        }
}

Her taleple birlikte JWT'yi geçiyorum. Lütfen değişken isimlerine aldırmayın, biraz kafa karıştırıcı.

class AddCookiesInterceptor(context: Context) : Interceptor {
    val mContext: Context = context
    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        val builder = chain.request().newBuilder()
        val preferences = CookieStore().getCookies(mContext)
        if (preferences != null) {
            for (cookie in preferences!!) {
                builder.addHeader("Authorization", cookie)
            }
        }
        return chain.proceed(builder.build())
    }
}

1

Kotlin'de durdurucu eklemek şu şekilde görünür:

.addInterceptor{ it.proceed(it.request().newBuilder().addHeader("Cache-Control", "no-store").build())}

0

Kotlin ile yazılmış RetrofitHelper kitaplığı, birkaç satır kod kullanarak API çağrıları yapmanıza izin verir.

Uygulama sınıfınıza aşağıdaki gibi başlıklar ekleyin:

class Application : Application() {

    override fun onCreate() {
    super.onCreate()

        retrofitClient = RetrofitClient.instance
                    //api url
                .setBaseUrl("https://reqres.in/")
                    //you can set multiple urls
        //                .setUrl("example","http://ngrok.io/api/")
                    //set timeouts
                .setConnectionTimeout(4)
                .setReadingTimeout(15)
                    //enable cache
                .enableCaching(this)
                    //add Headers
                .addHeader("Content-Type", "application/json")
                .addHeader("client", "android")
                .addHeader("language", Locale.getDefault().language)
                .addHeader("os", android.os.Build.VERSION.RELEASE)
            }

        companion object {
        lateinit var retrofitClient: RetrofitClient

        }
    }  

Ve sonra aramanızı yapın:

retrofitClient.Get<GetResponseModel>()
            //set path
            .setPath("api/users/2")
            //set url params Key-Value or HashMap
            .setUrlParams("KEY","Value")
            // you can add header here
            .addHeaders("key","value")
            .setResponseHandler(GetResponseModel::class.java,
                object : ResponseHandler<GetResponseModel>() {
                    override fun onSuccess(response: Response<GetResponseModel>) {
                        super.onSuccess(response)
                        //handle response
                    }
                }).run(this)

Daha fazla bilgi için belgelere bakın


0

Kotlin versiyonu

fun getHeaderInterceptor():Interceptor{
    return object : Interceptor {
        @Throws(IOException::class)
        override fun intercept(chain: Interceptor.Chain): Response {
            val request =
            chain.request().newBuilder()
                    .header(Headers.KEY_AUTHORIZATION, "Bearer.....")
                    .build()
            return chain.proceed(request)
        }
    }
}


private fun createOkHttpClient(): OkHttpClient {
    return OkHttpClient.Builder()
            .apply {
                if(BuildConfig.DEBUG){
                    this.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC))
                }
            }
            .addInterceptor(getHeaderInterceptor())
            .build()
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.