में हेडर जोड़ने का सुरुचिपूर्ण तरीका मेरा रेट्रोफिट 2 (2.0.2
वर्तमान में) क्लाइंट को अनुरोधों के लिए कस्टम हेडर जोड़ने की आवश्यकता है।रेट्रोफिट 2 - एपीआई स्तर
मैं सभी अनुरोधों के लिए इन हेडर जोड़ने के लिए एक Interceptor
उपयोग कर रहा हूँ:
OkHttpClient httpClient = new OkHttpClient();
httpClient.networkInterceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
final Request request = chain.request().newBuilder()
.addHeader("CUSTOM_HEADER_NAME_1", "CUSTOM_HEADER_VALUE_1")
.addHeader("CUSTOM_HEADER_NAME_2", "CUSTOM_HEADER_VALUE_2")
...
.addHeader("CUSTOM_HEADER_NAME_N", "CUSTOM_HEADER_VALUE_N")
.build();
return chain.proceed(request);
}
});
Retrofit retrofitClient = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(httpClient)
.build();
कुछ हेडर मैं हमेशा जोड़ना चाहते हैं, लेकिन कुछ हेडर मैं केवल कि विशिष्ट endpoint की आवश्यकताओं के आधार पर जोड़ने की जरूरत है, के लिए उदाहरण के लिए उपयोगकर्ता को प्रमाणीकृत होना चाहिए या नहीं।
मैं एक एनोटेशन का उपयोग कर उदाहरण के लिए, एपीआई स्तर पर है कि नियंत्रित करने की क्षमता प्राप्त करना चाहते हैं, कुछ की तरह:
public interface MyApi {
@NO_AUTH
@POST("register")
Call<RegisterResponse> register(@Body RegisterRequest data);
@GET("user/{userId}")
Call<GetUserResponse> getUser(@Path("userId") String userId);
}
जब एक अनुरोध भेजने register
को प्रमाणीकरण टोकन जोड़ने के लिए कोई आवश्यकता नहीं है , लेकिन @NO_AUTH
एनोटेशन की कमी वाले अनुरोधों में टोकन हेडर होगा।
जो मैं समझता हूं उससे रेट्रोफिट 2 कस्टम एनोटेशन का समर्थन नहीं करता है, और जब मुझे Custom Annotations with Retrofit 2 के लिए यह कामकाज मिला, तो यह थोड़ा सा लगता है।
मैं अनुरोध के अनुसार इन हेडर, की तरह पारित करने के लिए की जरूरत से बचने के लिए करना चाहते हैं:
public interface MyApi {
@POST("register")
Call<RegisterResponse> register(@Body RegisterRequest data);
@GET("user/{userId}")
Call<GetUserResponse> getUser(@Header("AuthToken") String token, @Path("userId") String userId);
}
यह सिर्फ निरर्थक लगता है यह हर बार जब मैं बजाय इंटरसेप्टर में यह करने की विधि कॉल करने के लिए (के बाद से मेरे पास स्थिर रूप से हेडर मानों तक पहुंच है)।
मुझे किसी भी तरह से मेरे Interceptor.intercept
कार्यान्वयन में जानने की आवश्यकता है या नहीं, इस विशिष्ट अनुरोध के पास एक विशिष्ट शीर्षलेख होना चाहिए या नहीं।
कोई विचार यह है कि मैं यह काम कैसे कर सकता हूं?
मैं केवल सामान्य टोकन मामले के लिए एक सामान्य समाधान पसंद करता हूं, लेकिन एक विशिष्ट समाधान भी आपका स्वागत है। धन्यवाद
क्या इसका मतलब है कि आप प्रत्येक अनुरोध के लिए नए '' 'OkHttpClient''' का उपयोग कर रहे हैं? –
@ पांडुका नं। यह सिर्फ उदाहरण के लिए था, आपके पास एक ग्राहक हो सकता है। –
यह वास्तव में सबसे साफ समाधान है, साझा करने के लिए धन्यवाद :) – MatPag