2016-03-04 12 views
5

में हेडर की सूची गतिशील रूप से सेट करने के लिए कैसे करें हम रेट्रोफिट 2 का उपयोग करने के लिए माइग्रेट करने का प्रयास कर रहे हैं और मुझे आवश्यकता के साथ परेशानी हो रही है जहां हमें प्रत्येक के लिए गतिशील रूप से जेनरेट किए गए हेडर (एनालिटिक्स के लिए उपयोग किया जाता है) का एक सेट पास करना होगा निवेदन।रेट्रोफिट 2 (एंड्रॉइड)

@ हेडर पैरामीटर स्तर पर समर्थित नहीं हैं और चूंकि हेडर फ़ील्ड नाम वर्तमान गतिविधि के आधार पर भिन्न होता है, इसलिए मैं @ हेडर का उपयोग नहीं कर सकता।

क्या निष्पादन() से पहले हेडर को जोड़ने का कोई तरीका है? (@ क्वेरीमैप/@ फील्डमैप के समान कुछ ढूंढ रहे हैं लेकिन हेडर के लिए)

नोट: क्लाइंट को प्रारंभ करते समय मेरे पास हेडर की सूची नहीं है (और इसलिए ऐसा करने के लिए इंटरसेप्टर का उपयोग नहीं किया जा सकता है)।

उत्तर

2

आप अभी भी इंटरसेप्टर का उपयोग कर सकते हैं (और करना है)।
आपको बस थोड़ा आर्किटेक्चर चाहिए।

पहले एक सहायक बनाएं जो आवश्यक शीर्षलेख प्रदान करता हो।

public class AnalyticsHeader { 
private String analyticsHeaderName; 
private String analyticsHeaderValue; 

public void setHeaderValue(String header) { 
    this.analyticsHeaderValue = header; 
} 

public void setHeaderName(String header) { 
    this.analyticsHeaderName = header; 
} 

public String getHeaderName() { 
    return analyticsHeaderName; 
} 
public String getHeaderValue() { 
    return analyticsHeaderValue; 
} 
} 

, MainActivity हमारे आवेदन अपने एप्लिकेशन के सुलभ जगह में इस वर्ग का एक उदाहरण रखें उदाहरण के लिए (या और भी बेहतर, का उपयोग निर्भरता इंजेक्शन)

अब, इंटरसेप्टर के निर्माण पर सिर्फ पारित AnalyticsHeader के कहने इंटरसेप्टर में:

public static final class AnalyticsInterceptor implements Interceptor { 
     private final AnalyticsHeader header; 

     public AnalyticsInterceptor(AnalyticsHeader header) { 
      this.header = header; 
     } 

     @Override 
     public Response intercept(Chain chain) throws IOException { 
      final Request original = chain.request(); 
      Response response; 
      if (header.getHeader() != null) { 
       Request request = original.newBuilder() 
         .header(header.getHeaderName(), header.getHeaderValue()) 
         .method(original.method(), original.body()) 
         .build(); 
       response = chain.proceed(request); 
      } else { 
       response = chain.proceed(original); 
      } 

     return response; 
     } 
} 

और फिर ...

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.addInterceptor(new AnalyticsInterceptor(CentralPlaceInApp.getAnalyticsHeader()); 
... 
retrofit = new Retrofit.Builder() 
       .baseUrl(config.getRestUrl()) 
       .client(builder.build()) 
       .build(); 

अब, आप CentralPlaceInApp.getAnalyticsHeader().setHeaderValue(CurrentActivity.class.getSimpleName());

का उपयोग करके अपने ऐप रनटाइम के दौरान कभी भी हेडर का मान बदल सकते हैं
संबंधित मुद्दे