রেট্রোফিট 2 দিয়ে সমস্ত অনুরোধে শিরোনাম যুক্ত করা হচ্ছে


128

রিট্রোফিট 2 এর ডকুমেন্টেশন বলে:

প্রতিটি অনুরোধে শিরোনাম যুক্ত হওয়া প্রয়োজন একটি OkHttp ইন্টারসেপ্টর ব্যবহার করে নির্দিষ্ট করা যেতে পারে।

এটি পূর্ববর্তী সংস্করণটি ব্যবহার করে সহজেই করা যেতে পারে, এখানে সম্পর্কিত কিউএ রয়েছে।

তবে রেট্রোফিট 2 ব্যবহার করে, আমি এমন কিছু setRequestInterceptorবা setInterceptorপদ্ধতি খুঁজে পাইনি যা Retrofit.Builderবস্তুর জন্য প্রয়োগ করা যেতে পারে ।

এছাড়াও মনে হয় আছে কোন RequestInterceptorমধ্যে OkHttp আর। রেট্রোফিটের ডকটি আমাদের ইন্টারসেপ্টারের কাছে উল্লেখ করে যে এই উদ্দেশ্যে কীভাবে এটি ব্যবহার করব তা আমি যথেষ্ট বুঝতে পারি নি।

কিভাবে আমি এটি করতে পারব?

উত্তর:


199
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 সংস্করণে এটি কিছুটা আলাদা। এখানে দেখুন: stackoverflow.com/questions/34973432/...
Ashkan Sarlak

আমরা কীভাবে নিশ্চিত করতে পারি যে এই হেডারগুলি প্রেরণ করা হয়েছে। আমি যখন কল ডিবাগ করি তখন আমি enqueueডিফল্ট শিরোনাম দেখতে পাই না।
ভাইপার

এটি new OkHttpClient.Builder()পরিবর্তে হওয়া উচিতnew OkHttpClient()
ওয়াজটেক

80

সর্বশেষ retrofit সংস্করণ এখানে -> 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

আপনার অনুরোধ এবং প্রতিক্রিয়া লগ করার জন্য আপনাকে একটি ইন্টারসেপ্টার প্রয়োজন এবং শিরোনাম সেট করার জন্য আপনাকে একটি ইন্টারসেপ্টারও দরকার, রেট্রোফিট ২.১ ব্যবহার করে একবারেই উভয় ইন্টারসেপ্টার যুক্ত করার সমাধান এখানে

 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 retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(getHeader(authorizationValue))
                .addConverterFactory(GsonConverterFactory.create())
                .build();

12

Retrofit 1.9 এবং 2.0 এর জন্য এই জাতীয় শিরোনামটি ব্যবহার করে দেখুন। জসন সামগ্রীর প্রকারের জন্য।

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

আপনি আরও অনেক শিরোনাম যুক্ত করতে পারেন ie

@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 ইন্টারসেপ্টারের সাহায্যে এইচটিটিপি ক্লিনেন্ট অবজেক্ট তৈরি করুন:

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 retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();

আপডেট করুন যদি আপনি কোটলিন ব্যবহার করেন { }অন্যথায় এটি কাজ করে না remove


2
ডুপ্লিকেট না করে ইন্টারফেসে সমস্ত অনুরোধগুলির জন্য কীভাবে একটি শিরোনাম তৈরি করবেন?
এভেজেনি ভোরোবি

আপনাকে এটি HTTP লগিং ইন্টারসেপ্টারে যুক্ত করতে হবে
অবিনাশ ভার্মা

6

আমার ক্ষেত্রে addInterceptor()এইচটিটিপি শিরোনামগুলি আমার অনুরোধে যুক্ত করার জন্য কাজ করে নি, আমাকে ব্যবহার করতে হয়েছিল 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

আপনি যদি এইচটিটিপিএলগিংইনটারসেপ্টার যুক্ত করার জন্য অ্যাডইনটারসেপ্টারের পদ্ধতি ব্যবহার করেন তবে এটি অন্যান্য ইন্টারসেপ্টরদের দ্বারা যুক্ত হওয়া জিনিসগুলিকে এইচটিটিপিএলগিংইনটারসেপ্টরের চেয়ে পরে লগ করা হবে না।

উদাহরণস্বরূপ: আপনার যদি দুটি ইন্টারসেপ্টর "HTTPLoggingInterceptor" এবং "AuthInterceptor" এবং প্রথমে HttpLoggingInterceptor প্রয়োগ করা হয়, তবে আপনি HTTP- প্যারাম বা শিরোনাম দেখতে পারবেন না যা অথিয়েন্টারসেপ্টারের দ্বারা সেট করা হয়েছে।

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

আমি অ্যাডনেটওয়ার্কইন্টারসেপ্টার পদ্ধতিটি ব্যবহার করে এটি সমাধান করেছি।


1
HttpLoggingInterceptorচূড়ান্ত অনুরোধটি দেখতে আপনি সর্বশেষ ইন্টারসেপ্টার হিসাবে যুক্ত করতে পারেন।
মাইক্রো

2

এই retrofit ক্লায়েন্ট ব্যবহার করুন

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


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()
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.