অ্যান্ড্রয়েড রিট্রোফিট প্যারামিটারাইজড @ হিডর


85

আমি ওআউথ ব্যবহার করছি এবং প্রতিবার আমি যখনই অনুরোধ করি তখন আমার হেডারে ওআউথ টোকেন লাগানো দরকার। আমি @Headerটীকাটি দেখছি , তবে এটিকে প্যারামিটারাইজড করার কোনও উপায় আছে যাতে আমি রান সময়টিতে প্রবেশ করতে পারি?

এই ধারণাটি এখানে

@Header({Authorization:'OAuth {var}', api_version={var} })

আপনি কি রানটাইম এ তাদের পাস করতে পারবেন?

@GET("/users")
void getUsers(
    @Header("Authorization") String auth, 
    @Header("X-Api-Version") String version, 
    Callback<User> callback
)

আপনি কি কখনও এটি খুঁজে বের করতে পারেন? আমাকে শিরোনামে একটি
টোকেনও দিতে হবে

আমি এর সমাধানও সন্ধান করছি, ডকুমেন্টেশন থেকে মনে হচ্ছে @ হ্যাডার () পদ্ধতিতে টীকাটি একের পর এক শিরোনামে ক্ষেত্র যুক্ত করে তবে কেবল আক্ষরিক সমর্থন করে। এবং @ হেইডার ("প্যারামিটার") স্ট্রিং স্ট্রিং প্যারামিটার টীকা সরবরাহকারী মানের সাথে শিরোনামকে প্রতিস্থাপন করে।
নানা

4
এখানে একই, রেট্রোফিট ব্যবহার করার সময় সেশনগুলি কীভাবে পরিচালনা করতে হয় তা সন্ধান করতে পারেনি।
এফআরআর

আমাদের সমস্ত আইটেম পাস করার দরকার ছিল না, পুনঃনির্ধারণ নিজেই সমস্ত পরিচালনা করে। স্ট্যাক ওভারফ্লোতে আমার উত্তর লিঙ্কটি পরীক্ষা করুন ।
সুবিন বাবু

উত্তর:


98

@ হ্যাডার প্যারামিটারটি ব্যবহার করার পাশাপাশি আমি আপনার ইন্টারফেসটি পরিবর্তন না করে আপনার অনুরোধটি আপডেট করার জন্য অনুরোধ অনুরোধকটি ব্যবহার করব। এর মতো কিছু ব্যবহার করা:

RestAdapter.Builder builder = new RestAdapter.Builder()
    .setRequestInterceptor(new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("Accept", "application/json;versions=1");
            if (isUserLoggedIn()) {
                request.addHeader("Authorization", getToken());
            }                    
        }
    });

পি / গুলি: আপনি যদি retrofit2 ব্যবহার করছেন তবে আপনার Interceptorপরিবর্তে ব্যবহার করা উচিতRequestInterceptor

যেহেতু RequestInterceptorআর্ট্রোফিট ২.০ এ আর পাওয়া যায় না


4
এটি সরাসরি সম্পর্কিত নয় তবে আপনার অনুমোদনের শিরোনাম উত্পন্ন করার জন্য যদি আপনি নিজেকে অনুরোধ অবজেক্টের থেকে মানগুলি পাওয়া প্রয়োজন বলে মনে করেন তবে আপনাকে ApacheClient প্রসারিত করতে হবে এবং অনুরোধ বস্তুর নকল করতে হবে (তালিকা <হেডার> শিরোনাম = ... ; অনুরোধ অনুরোধনু = নতুন অনুরোধ (অনুরোধ.getMethod (), অনুরোধ.getUrl (), শিরোনাম, অনুরোধ.কেটবডি ())

4
এটি এমন একটি কৌশল যা একটি কোডেড
আপকে মেসে ফেলেছে,

4
RestAdapterretrofit1 এর উপর নির্ভর করে, retrofit2 এ এটি Retrofit। আমি retrofit2 ব্যবহার করতে যাচ্ছি, তাই RequestInterceptorউপরের কোড হিসাবে ব্যবহার করা যদি কোনও সমস্যা না ?
হুই টাওয়ার

55

হ্যাঁ, আপনি তাদের রানটাইমে পাস করতে পারেন। প্রকৃতপক্ষে, আপনি যেমন টাইপ করেছেন ঠিক তেমনই। এটি আপনার এপিআই ইন্টারফেস ক্লাসে থাকবে, নাম সিক্রেটএপিআইন্টারনেস.জভা নামে

public interface SecretApiInterface {

    @GET("/secret_things")
    SecretThing.List getSecretThings(@Header("Authorization") String token)

}

তারপরে আপনি এই অনুরোধটি থেকে এই ইন্টারফেসে প্যারামিটারগুলি পাস করুন, সেই লাইনের পাশাপাশি কিছু: (এই ফাইলটি সিক্রেটথিংআরকুইস্ট.জভা উদাহরণস্বরূপ হবে )

public class SecretThingRequest extends RetrofitSpiceRequest<SecretThing.List, SecretApiInteface>{

    private String token;

    public SecretThingRequest(String token) {
        super(SecretThing.List.class, SecretApiInterface.class);
        this.token = token;
    }

    @Override
    public SecretThing.List loadDataFromNetwork() {
        SecretApiInterface service = getService();
        return service.getSecretThings(Somehow.Magically.getToken());
    }
}

Somehow.Magically.getToken()কোনও টোকেনকে যে পদ্ধতিতে কল আসে তা কোথায় , আপনি কোথায় এবং কীভাবে এটি সংজ্ঞায়িত করেন তা নির্ভর করবে।

আপনার অবশ্যই @Header("Blah") String blahইন্টারফেস প্রয়োগের ক্ষেত্রে একাধিক টিকা থাকতে পারে!

আমি এটিও বিভ্রান্তিকর অবস্থায় পেয়েছি, ডকুমেন্টেশনে পরিষ্কারভাবে বলা হয়েছে যে এটি শিরোনামকে প্রতিস্থাপন করে, তবে এটি করা যায় না !
এটি আসলে @Headers("hardcoded_string_of_liited_use")টীকা হিসাবে যুক্ত করা হয়

আশাকরি এটা সাহায্য করবে ;)


4
আমি ডক্সে পেয়েছি যে এটি একটি বিদ্যমান শিরোলেখাকে প্রতিস্থাপন করে না: "নোট করুন যে একে অপরকে ওভাররাইট করে না" " চেক square.github.io/retrofit এবং "শিরোলেখ ম্যানিপুলেশন"
Amio.io

37

গৃহীত উত্তরটি রিট্রোফিটের পুরানো সংস্করণের জন্য। ভবিষ্যতের দর্শকদের জন্য Retrofit২.০ সহ এটি করার উপায়টি একটি কাস্টম OkHttp ক্লায়েন্ট ব্যবহার করছে:

OkHttpClient httpClient = new OkHttpClient.Builder()
  .addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
      Builder ongoing = chain.request().newBuilder();
      ongoing.addHeader("Accept", "application/json;versions=1");
      if (isUserLoggedIn()) {
        ongoing.addHeader("Authorization", getToken());
      }
      return chain.proceed(ongoing.build());
    }
  })
  .build();

Retrofit retrofit = new Retrofit.Builder()
  // ... extra config
  .client(httpClient)
  .build();

আশা করি এটি কাউকে সাহায্য করবে। :)


4
ডাগার 2 এর সাথে সাধারণ ব্যবহারে, retrofit2 সিঙ্গলটন হবে, সুতরাং প্রতিটিবারেই httpclient তৈরি হবে না। সেক্ষেত্রে isUserLoggedIn () বোঝায় না, আমি ঠিক আছি? আমি বর্তমানে যে সমাধান দেখতে পাচ্ছি তা হল ব্যবহারকারী লগইন স্থিতি পরিবর্তন করা হলে retrofit2 পুনর্নির্মাণকে বাধ্য করা, যাতে উপযুক্ত শিরোনামটি অনুরোধ থেকে যুক্ত করা বা অপসারণ করা যায় .. অথবা এমন কিছু স্পষ্ট সমাধান রয়েছে যা আমি বর্তমানে দেখতে পাচ্ছি না? ধন্যবাদ
বাজিকডুস্কো

4
@ বাজিকডুসকো এটি আমার একই একই সংযোগ আপনি কি সমাধান খুঁজে পেয়েছেন? এটি এত অপব্যয়কর এবং অদ্ভুত বলে মনে হচ্ছে যে পূর্ববর্তী সংস্করণটি আরও কার্যকর।
deed02392

@ ডিড02392 আপনি কোনও সংমিশ্রণ সেট Interceptorকরতে পারেন যা আপনি পরবর্তী পর্যায়ে ইন্টারসেপ্টার সেট বা রিসেট করতে পারেন। তবে, আমি যুক্তি দিয়ে বলব যে সিঙ্গলটন হিসাবে রেট্রোফিট থাকা প্রথম দিকে অপ্টিমাইজেশনের লক্ষণ হতে পারে। নতুন retrofit উদাহরণ তৈরির জন্য কোনও ওভারহেড নেই: github.com/square/retrofit/blob/master/retrofit/src/main/java/…
পাব্লিসকো

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

@ পাবলিসকো আহ আমার বোঝা থেকে আপনি Interceptorএকবার যোগ করতে বা সরাতে পারবেন না একবার আপনি একটি রেট্রোফিট 2 উদাহরণ তৈরি করেছেন।
ডিড02392

7

পুনঃনির্মাণ 2.3.0

OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
    okHttpClientBuilder
            .addInterceptor(new Interceptor() {
                @Override
                public okhttp3.Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    Request.Builder newRequest = request.newBuilder().header("Authorization", accessToken);
                    return chain.proceed(newRequest.build());
                }
            });

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(GithubService.BASE_URL)
            .client(okHttpClientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();

আমি এটি গিটহাবের সাথে সংযোগ করতে ব্যবহার করছি।

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