রেট্রোফিট ২.০ এ শিরোনাম যুক্ত করতে কীভাবে ইন্টারসেপ্টার ব্যবহার করবেন?


96

আমাদের দলটি রেট্রোফিট ২.০ গ্রহণ করার সিদ্ধান্ত নিয়েছে এবং আমি এটি সম্পর্কে কিছু প্রাথমিক গবেষণা করছি। আমি এই লাইব্রেরির নবাগত।

আমি ভাবছি কীভাবে আমাদের অ্যান্ড্রয়েড অ্যাপ্লিকেশনে retrofits 2.0 এরinterceptor মাধ্যমে কাস্টমাইজড শিরোনাম যুক্ত করতে ব্যবহার করবেন । রেট্রোফিট ১. এক্স এ শিরোনাম যুক্ত করার বিষয়ে অনেক টিউটোরিয়াল রয়েছে তবে এপিআইগুলি যেহেতু সর্বশেষ সংস্করণে অনেক পরিবর্তন করেছে তাই নতুন সংস্করণে কীভাবে এই পদ্ধতিগুলি মানিয়ে নেবেন সে বিষয়ে আমি নিশ্চিত নই। এছাড়াও, রেট্রোফিট এখনও তার নতুন ডকুমেন্টেশন আপডেট করে নি।interceptor

উদাহরণস্বরূপ, নিম্নলিখিত কোডগুলিতে, Interceptorঅতিরিক্ত শিরোনাম যুক্ত করার জন্য আমি ক্লাসটি কীভাবে প্রয়োগ করব ? এ ছাড়া অনাবন্ধিত Chainঅবজেক্টটি আসলে কী? কখন intercept()ডাকা হবে?

    OkHttpClient client = new OkHttpClient();
    client.interceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response response = chain.proceed(chain.request());

            // How to add extra headers?

            return response;
        }
    });

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_API_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

4
নিশ্চিত হয়ে নিন যে আপনার BASE_API_URL এর সাথে শেষ হয়েছে /এবং আপনার এপিআই url না ( stuff/post/whatever)
এপিকপান্ডা ফরাস

উত্তর:


120

এটা দেখ.

public class HeaderInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request()
                .newBuilder()
                .addHeader("appid", "hello")
                .addHeader("deviceplatform", "android")
                .removeHeader("User-Agent")
                .addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0")
                .build();
        Response response = chain.proceed(request);
        return response;
    }
}

কোটলিন

class HeaderInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response = chain.run {
        proceed(
            request()
                .newBuilder()
                .addHeader("appid", "hello")
                .addHeader("deviceplatform", "android")
                .removeHeader("User-Agent")
                .addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0")
                .build()
        )        
    }
}

ধন্যবাদ !! সুতরাং, intercept()অ্যাপ্লিকেশন থেকে প্রতিবার অনুরোধ পাঠানোর সময় এটি কি ট্রিগার হয়? আমরা কি পুনর্নির্দেশের জন্য মধ্যবর্তী প্রতিক্রিয়াটি ধরতে পারি, বা আমরা কেবল চূড়ান্ত প্রতিক্রিয়া পেতে পারি?
হ্যাকজুতু

এটি প্রতিটি অনুরোধের জন্য বলা হয়, এবং যদি আমি সঠিকভাবে জানি তবে এটি এটিকে একটি ইন্টারসেপ্টর হিসাবে যোগ করার জন্য, কোনও নেটওয়ার্ক ইন্টারসেপ্টার হিসাবে নয়। আমার মনে হয় আপনি শুধুমাত্র চূড়ান্ত প্রতিক্রিয়া এখানে পেতে পারেন, কিন্তু পুনঃনির্দেশ যে আমি আমার মাথার উপরে বন্ধ জানি না যেমন পুনঃনির্দেশ এইজন্য অনুমতি দেয় একটি কনফিগ হতে পারে (সেখানে HTTP URL টি সংযোগের জন্য এক অত্যন্ত।)
EpicPandaForce

4
কেবল এই লিঙ্কটি দেখুন: github.com/square/okhttp/wiki/Interceptors , এবং আমার প্রয়োজনীয় তথ্য পান :) আপনাকে ধন্যবাদ ~
হ্যাকজুতসু 6:38

5
ফাই, আপনার পরিবর্তে কোনও বিল্ডার ব্যবহার করা উচিত client.interceptors()। দেখে মনে হচ্ছেnew OkHttpClient.Builder().addInterceptor(<Your Interceptor>).build()
GLee

22

গৃহীত উত্তর থেকে আরেকটি বিকল্প

public class HeaderInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        request = request.newBuilder()
                .addHeader("headerKey0", "HeaderVal0")
                .addHeader("headerKey0", "HeaderVal0--NotReplaced/NorUpdated") //new header added
                .build();

        //alternative
        Headers moreHeaders = request.headers().newBuilder()
                .add("headerKey1", "HeaderVal1")
                .add("headerKey2", "HeaderVal2")
                .set("headerKey2", "HeaderVal2--UpdatedHere") // existing header UPDATED if available, else added.
                .add("headerKey3", "HeaderKey3")
                .add("headerLine4 : headerLine4Val") //line with `:`, spaces doesn't matter.
                .removeAll("headerKey3") //Oops, remove this.
                .build();

        request = request.newBuilder().headers(moreHeaders).build();

        /* ##### List of headers ##### */
        // headerKey0: HeaderVal0
        // headerKey0: HeaderVal0--NotReplaced/NorUpdated
        // headerKey1: HeaderVal1
        // headerKey2: HeaderVal2--UpdatedHere
        // headerLine4: headerLine4Val

        Response response = chain.proceed(request);
        return response;
    }
}

চমৎকার! তাহলে request.newBuilder().headers(moreHeaders).build()কি আসল হেডারগুলি রাখবে?
হ্যাকজুতসু

4
হ্যাঁ. সরানোর সমস্ত (স্ট্রিং নাম) কল না করা হলে কোনও শিরোনামকে অনুরোধ থেকে সরানো হয় না ।
ভেনমভেন্ডর

@VenomVendor সাহায্যের একটি অনুরূপ প্রশ্ন এখানে আমাকে খুশি stackoverflow.com/questions/45078720/... ধন্যবাদ
user606669

এটি নতুন অবজেক্ট তৈরি করা চালিয়ে দেবে না?
TheRealChx101

3
   public class ServiceFactory {  
    public static ApiClient createService(String authToken, String userName, String password) {
            OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(
                            chain -> {
                                Request request = chain.request().newBuilder()
                                        .headers(getJsonHeader(authToken))
                                        .build();
                                return chain.proceed(request);
                            })
                    .authenticator(getBasicAuthenticator(userName, password))
                    .build();
            return getService(defaultHttpClient);
        }
        private static Headers getJsonHeader(String authToken) {
            Headers.Builder builder = new Headers.Builder();
            builder.add("Content-Type", "application/json");
            builder.add("Accept", "application/json");
            if (authToken != null && !authToken.isEmpty()) {
                builder.add("X-MY-Auth", authToken);
            }
            return builder.build();
        }
        private static Authenticator getBasicAuthenticator(final String userName, final String password) {
            return (route, response) -> {
                String credential = Credentials.basic(userName, password);
                return response.request().newBuilder().header("Authorization", credential).build();
            };
        }
          private static ApiClient getService(OkHttpClient defaultHttpClient) {
            return new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(defaultHttpClient)
                    .build()
                    .create(ApiClient.class);
        }
}

2

আপনি এর মতো অন্তর্নির্মিত পদ্ধতিগুলি সহ ইন্টারসেপ্টরগুলি ব্যবহার করে শিরোনাম করতে পারেন

   interceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request original = chain.request();

            Request.Builder builder = original.newBuilder();

            builder.header("Authorization","Bearer "+ LeafPreference.getInstance(context).getString(LeafPreference.TOKEN));

            Request request = builder.method(original.method(), original.body())
                    .build();
            Log.e("request",request.urlString());
            Log.e("header",request.header("Authorization"));
            return chain.proceed(request);
        }
    });
}

আমি জানতে চাই যে এই জায়গায় আপনি কীভাবে প্রসঙ্গ পাবেন ?
রুপিন্দরজিৎ

final Context contextপ্যারামিটারের তালিকায় সম্ভবত একটিরূপী রুপিন্দরজিট a
TheRealChx101

@ TheRealChx101 কেবল উল্লেখ করতে চেয়েছিলেন যে আমাদের contextএখানে থাকা উচিত নয় কারণ এটি ব্যবসায়ের যুক্তি।
রুপিন্দরজিৎ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.