java - रेट्रोफ़िट 2 के साथ सभी अनुरोधों में हेडर जोड़ना




android header (6)

नवीनतम रेट्रोफिट संस्करण यहां -> 2.1.0।

लंबोदर संस्करण:

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

बदसूरत लंबा संस्करण:

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

पूर्ण संस्करण:

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

ग्रेड फ़ाइल (यदि आप इसे उपयोग करने की योजना बनाते हैं तो आपको लॉगिंग इंटरसेप्टर को जोड़ना होगा):

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

रेट्रोफिट 2 के दस्तावेज कहते हैं:

हर अनुरोध में जोड़े जाने वाले हेडर को एक OkHttp इंटरसेप्टर का उपयोग करके निर्दिष्ट किया जा सकता है।

यह पिछले संस्करण का उपयोग करके आसानी से किया जा सकता है, here's संबंधित क्यूए है।

लेकिन रेट्रोफिट 2 का उपयोग करते हुए, मुझे setRequestInterceptor या setInterceptor विधि जैसी कोई चीज नहीं मिल रही है जिसे Retrofit.Builder ऑब्जेक्ट पर लागू किया जा सकता है।

इसके अलावा ऐसा लगता है कि RequestInterceptor में अब कोई OkHttp नहीं है। रेट्रोफिट का डॉक हमें Interceptor को संदर्भित करता है कि मुझे यह समझ में नहीं आया कि इस उद्देश्य के लिए इसका उपयोग कैसे करें।

मैं यह कैसे कर सकता हूँ?


अपने अनुरोध और प्रतिक्रिया को लॉग इन करने के लिए आपको एक इंटरसेप्टर की आवश्यकता होती है और हेडर को सेट करने के लिए भी आपको एक इंटरसेप्टर की आवश्यकता होती है, यहाँ पर रेट्रोपिट 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;

    }

अब अपने रेट्रोफिट ऑब्जेक्ट में इस हेडर को क्लाइंट में जोड़ें

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

कोटलिन जोड़ने में इंटरसेप्टर इस तरह दिखता है:

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

कोटलिन में लिखी गई रिट्रोफिट हेल्पर लाइब्रेरी, आपको कोड की कुछ पंक्तियों का उपयोग करके एपीआई कॉल करने देगी।

इस तरह अपने आवेदन वर्ग में हेडर जोड़ें:

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

और फिर अपना कॉल करें:

 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) 

अधिक जानकारी के लिए दस्तावेज़ीकरण देखें


मेरे मामले में addInterceptor() HTTP हेडर को मेरे अनुरोध में जोड़ने के लिए काम नहीं किया, मुझे addNetworkInterceptor() का उपयोग करना पड़ा। कोड इस प्रकार है:

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

और इंटरसेप्टर कोड:

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

यह और इस उदाहरण पर अधिक उदाहरण


यदि आप ऐड-इन-रिसेप्टर विधि का उपयोग HttpLoggingInterceptor जोड़ने के लिए करते हैं, तो यह उन चीजों को लॉगिंग नहीं करेगा जो अन्य इंटरसेप्टर द्वारा जोड़े गए हैं जो कि HttpLoggingInterceptor की तुलना में बाद में लागू होते हैं।

उदाहरण के लिए: यदि आपके पास दो इंटरसेप्टर "HttpLoggingInterceptor" और "AuthInterceptor" हैं, और HttpLoggingInterceptor पहले लागू किए गए हैं, तो आप http-params या हेडर नहीं देख सकते हैं जो AuthInterceptor द्वारा सेट किए गए हैं।

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

मैंने इसे AddNetworkInterceptor मेथड के जरिए हल किया।





retrofit