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


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

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

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

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

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

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


76
2017-09-16 10:12


मूल




जवाब:


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



Retrofit2-beta3 संस्करण में यह थोड़ा अलग है। यहाँ देखें: stackoverflow.com/questions/34973432/... - Ashkan Sarlak
हम कैसे पुष्टि कर सकते हैं कि इन शीर्षकों को भेजा जाता है। जब मैं कॉल पर डीबग करता हूं enqueue मैं डिफ़ॉल्ट शीर्षलेख नहीं देख सकता। - viper
यह होना चाहिए new OkHttpClient.Builder() बजाय new OkHttpClient() - Wojtek


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

54
2018-01-26 21:23





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

9
2017-08-23 07:27





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

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


3
2017-08-11 12:04





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

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

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

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


2
2018-06-30 12:47



आप भी जोड़ सकते हैं HttpLoggingInterceptor अंतिम अनुरोध देखने के लिए अंतिम इंटरसेप्टर के रूप में। - Micer


मुझे जेसन सामग्री प्रकार के लिए रेट्रोफिट 1.9 और 2.0 के लिए एक और तरीका मिला।

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

आप कई और शीर्षलेख जोड़ सकते हैं i.e

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

1
2018-03-27 19:11