2016-08-02 5 views
5

का उपयोग करते समय डैगर 2.0 के साथ कई एंडपॉइंट्स का समर्थन कैसे करें एक एंड्रॉइड प्रोजेक्ट के लिए मैंने निम्नलिखित डैगर मॉड्यूल में दिखाए गए अनुसार डैगर 2.6 के साथ रेट्रोफिट 2.1.0 और ओकेएचटीपी 3.4.1 कॉन्फ़िगर किया। मैं @Named क्वालीफायर का उपयोग करके कई बैकएंड का समर्थन करना चाहता हूं।मैकवेबसेवर

@Module 
public class ApiModule { 

    private static final String GITHUB_QUALIFIER = "GitHub"; 

    private static final String TWITTER_QUALIFIER = "Twitter"; 

    @Provides 
    GitHubClient provideGitHubClient(@Named(GITHUB_QUALIFIER) Retrofit retrofit) { /* ... */ } 

    @Provides 
    TwitterClient provideTwitterClient(@Named(TWITTER_QUALIFIER) Retrofit retrofit) { /* ... */ } 

    @Named(GITHUB_QUALIFIER) 
    @Provides 
    @Singleton 
    HttpUrl provideGitHubBaseUrl() { /* ... */ } 

    @Named(TWITTER_QUALIFIER) 
    @Provides 
    @Singleton 
    HttpUrl provideTwitterBaseUrl() { /* ... */ } 

    @Named(GITHUB_QUALIFIER) 
    @Provides 
    @Singleton 
    Retrofit getGitHubRetrofit(@Named(GITHUB_QUALIFIER) HttpUrl httpUrl, 
           OkHttpClient okHttpClient) { /* ... */ } 

    @Named(TWITTER_QUALIFIER) 
    @Provides 
    @Singleton 
    Retrofit getTwitterRetrofit(@Named(TWITTER_QUALIFIER) HttpUrl httpUrl, 
           OkHttpClient okHttpClient) { /* ... */ } 

    private Retrofit getRetrofit(String baseUrl, 
           OkHttpClient okHttpClient) { /* ... */ } 

    @Provides 
    @Singleton 
    public OkHttpClient provideOkHttpClient() { /* ... */ } 

} 

मैं परीक्षण के लिए MockWebServer का उपयोग करना चाहता हूं। हालांकि, मैं बाहर नहीं मिल रहा है, जबकि एक ही समय में एकाधिक बैकेंड समर्थन कैसे मैं MockWebServer के URL में पारित कर सकते हैं:

// From a unit test 

mockWebServer = new MockWebServer(); 
mockWebServer.start(); 
ApiModule apiModule = new ApiModule(); 
OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); 

String url = mockWebServer.url("/").toString(); 
// Here I cannot pass the URL to Retrofit 
Retrofit retrofit = apiModule.provideRetrofit(/* HERE */ okHttpClient); 

gitHubClient = apiModule.provideGitHubClient(retrofit); 

उत्तर

0

यह okhttp इंटरसेप्टर के साथ आधार यूआरएल ओवरराइड करने के लिए संभव है।

public final class HostSelectionInterceptor implements Interceptor { 
    private volatile String mHost; 

    public void setHost(String host) { 
     this.mHost = checkNotNull(host); 
    } 

    @Override 
    public okhttp3.Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 
     String host = this.mHost; 
     if (host != null) { 
      HttpUrl overriddenBaseUrl = HttpUrl.parse(host); 
      HttpUrl newUrl = request.url() 
        .newBuilder() 
        .host(overriddenBaseUrl.host()) 
        .build(); 
      request = request.newBuilder() 
        .url(newUrl) 
        .build(); 
     } 
     return chain.proceed(request); 
    } 
} 

यहाँ से लिया: https://gist.github.com/swankjesse/8571a8207a5815cca1fb

आप MockWebServer यूआरएल को खिलाने के लिए इस इंटरसेप्टर का उपयोग या यहाँ तक कि मचान समाप्ति बिंदुओं के बीच स्विच डिबग बनाता है के लिए कर सकते हैं।