okhttp

2016-01-11 14 views
12

के साथ रेट्रोफिट 2 में सामान्य पथ पैरामीटर को बदलें, मेरे पास समान बेस यूआरएल के साथ कुछ सेवा यूआरएल हैं। कुछ यूआरएल के लिए कुछ सामान्य उपयोग किए गए पैरामीटर होंगे, उदाहरण के लिए apiVersion या locale। लेकिन उन्हें हर यूआरएल में होना जरूरी नहीं है, इसलिए मैं उन्हें बेस यूआरएल में नहीं जोड़ सकता।okhttp

.../api/{apiVersion}/{locale}/event/{eventId} 
.../api/{apiVersion}/{locale}/venues 
.../api/{apiVersion}/configuration 

मैं इन पैरामीटर को रेट्रोफिट इंटरफ़ेस में जोड़ना नहीं चाहता हूं। रेट्रोफिट 1 में, मैंने एक इंटरसेप्टर बनाया और प्रत्येक यूआरएल के लिए इन सामान्य पथ पैरामीटर को भरने के लिए RequestFacade.addPathParam(..., ...) का उपयोग किया।

रेट्रोफिट 2 के लिए, मुझे okhttp के साथ ऐसा करने का उचित तरीका नहीं दिख रहा है। एकमात्र तरीका यह है कि मैं अभी यह संभव देख रहा हूं HttpUrlChain.request().httpUrl(); से okhttp Interceptor में प्राप्त करें और इसे स्वयं में हेरफेर करें, लेकिन मुझे नहीं पता कि यह जाने का सबसे अच्छा तरीका है या नहीं।

क्या कोई भी okhttp Interceptor में पथ पैरामीटर को प्रतिस्थापित करने के लिए बेहतर तरीके से आया है?

लेखन के समय मैं रेट्रोफिट का उपयोग कर रहा हूं: 2.0.0-beta2 और okhttp: 2.7.2।

+0

इस जवाब http://stackoverflow.com/a/31002094 पर एक नज़र डालें। – mtotschnig

+0

@mtotschnig उस धागे पर कोई अद्यतित उत्तर नहीं है (OkHttp 3+ और Retrofit 2+ का उपयोग करके)। – Singed

+0

@ उत्तर देने के लिए मैं रेट्रोफिट 2 और ओकेएचटीपी 3 – mtotschnig

उत्तर

5

पुराना वापस 2 के लिए, मैं okhttp के साथ ऐसा करना उचित तरीके खोजने के लिए प्रतीत नहीं कर सकते हैं। एकमात्र तरीका यह है कि मैं अभी यह संभव देख रहा हूं कि Chain.request() से HttpUrl प्राप्त करें। HttpUrl(); एक okhttp इंटरसेप्टर और में एक खुद को कुशलतापूर्वक उपयोग करें, लेकिन मुझे नहीं पता कि यह जाने का सबसे अच्छा तरीका है या नहीं।

okhttp का उपयोग कर मेरे कार्यान्वयन: 3,2

class PathParamInterceptor implements Interceptor { 
     private final String mKey; 
     private final String mValue; 

     private PathParamInterceptor(String key, String value) { 
      mKey = String.format("{%s}", key); 
      mValue = value; 
     } 

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

      HttpUrl.Builder urlBuilder = originalRequest.url().newBuilder(); 
      List<String> segments = originalRequest.url().pathSegments(); 

      for (int i = 0; i < segments.size(); i++) { 
       if (mKey.equalsIgnoreCase(segments.get(i))) { 
        urlBuilder.setPathSegment(i, mValue); 
       } 
      } 

      Request request = originalRequest.newBuilder() 
        .url(urlBuilder.build()) 
        .build(); 
      return chain.proceed(request); 
     } 
    } 
+0

इससे मेरी मदद की। पथ सेगमेंट प्राप्त करना और उनके माध्यम से लूप करना सुरक्षित है, क्योंकि यदि पथ खंड कभी बदलता है तो कोड तोड़ नहीं जाएगा। – OldSchool4664

संबंधित मुद्दे