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


129

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

हेडर जिन्हें हर अनुरोध में जोड़ा जाना आवश्यक है, उन्हें ओकेथेप्ट इंटरसेप्टर का उपयोग करके निर्दिष्ट किया जा सकता है।

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

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

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

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

जवाबों:


200
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
रेट्रोफिट 2-बीटा 3 संस्करण में यह थोड़ा अलग है। यहां देखें: stackoverflow.com/questions/34973432/…
Ashkan Sarlak

हम कैसे पुष्टि कर सकते हैं कि ये हेडर भेजे गए हैं। जब मैं कॉल पर डीबग करता हूं तो मैं enqueueडिफ़ॉल्ट हेडर नहीं देख सकता।
सांप

इसके new OkHttpClient.Builder()बजाय होना चाहिएnew OkHttpClient()
वोजटेक

80

नवीनतम रेट्रोफिट संस्करण यहां -> 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'

13

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

12

रिट्रोफिट 1.9 और 2.0 के लिए इस प्रकार के शीर्ष लेख का प्रयास करें। JSON सामग्री प्रकार के लिए।

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

आप कई और हेडर जोड़ सकते हैं

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

गतिशील रूप से शीर्ष लेख में जोड़ें:

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

आप विधि को बुलाओ

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

या

हर बार पास करना चाहते हैं तो http इंटरसेप्टर के साथ HttpClient ऑब्जेक्ट बनाएं:

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

फिर रेट्रोफिट ऑब्जेक्ट में जोड़ें

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

अद्यतन करें यदि आप कोटलिन का उपयोग कर रहे हैं { }तो इसे हटा दें, यह काम नहीं करेगा


2
इसे दोहराए बिना इंटरफ़ेस में सभी अनुरोधों के लिए एक हेडर कैसे बनाया जाए?
Evgenii Vorobei

आपको इसे HTTP लॉगिंग इंटरसेप्टर
अविनाश वर्मा

6

मेरे मामले में 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());
    }
}

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


5

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

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

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

मैंने इसे addNetworkInterceptor मेथड का उपयोग करके हल किया।


1
HttpLoggingInterceptorअंतिम अनुरोध देखने के लिए आप अंतिम अवरोधक के रूप में भी जोड़ सकते हैं।
15

2

इस रेट्रोफिट क्लाइंट का उपयोग करें

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

मैं हर अनुरोध के साथ JWT पास कर रहा हूं। कृपया चर नामों पर ध्यान न दें, यह थोड़ा भ्रमित करने वाला है।

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

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

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

0

RetrofitHelper kotlin में लिखा पुस्तकालय, आप कोड की कुछ लाइनें का उपयोग कर API कॉल करने, करने देगा।

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

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)

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


0

कोटलीन संस्करण होगा

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()
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.