Set dynamic base url using Retrofit 2.0 and Dagger 2

前端 未结 8 577
南旧
南旧 2020-11-27 12:36

I\'m trying to perform a login action using Retrofit 2.0 using Dagger 2

Here\'s how I set up Retrofit dependency

@Provides
@Singleton
Retrofit provid         


        
8条回答
  •  眼角桃花
    2020-11-27 12:50

    Please look into my workaround for Dagger dynamic URL.

    Step1: Create an Interceptor

    import android.util.Patterns;
    
    import com.nfs.ascent.mdaas.repo.network.ApiConfig;
    
    import java.io.IOException;
    
    import okhttp3.Interceptor;
    import okhttp3.Request;
    import okhttp3.Response;
    
    public class DomainURLInterceptor implements Interceptor {
    
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request original = chain.request();
    
            String requestUrl = original.url().toString();
            String PROTOCOL = "(?i:http|https|rtsp)://";
            String newURL = requestUrl.replaceFirst(PROTOCOL, "")
                    .replaceFirst(Patterns.DOMAIN_NAME.toString(), "");
            newURL = validateBackSlash(newURL) ? ApiConfig.BASE_URL.concat(newURL) : newURL.replaceFirst("/", ApiConfig.BASE_URL);
            original = original.newBuilder()
                    .url(newURL)
                    .build();
    
            return chain.proceed(original);
        }
    
        private boolean validateBackSlash(String str) {
            if (!str.substring(str.length() - 1).equals("/")) {
                return true;
            }
            return false;
        }
    
    }
    

    Step 2:

    add your newly created interceptor in your module

        @Provides
        @Singlton
        DomainURLInterceptor getChangeURLInterceptor() {
            return new DomainURLInterceptor();
        }
    

    step 3: add interceptor into list of HttpClient interceptors

        @Provides
        @Singlton
        OkHttpClient provideHttpClient() {
            return new OkHttpClient.Builder()
                    .addInterceptor(getChangeURLInterceptor())
                    .readTimeout(ApiConfig.API_CONNECTION_TIMEOUT, TimeUnit.SECONDS)
                    .connectTimeout(ApiConfig.API_CONNECTION_TIMEOUT, TimeUnit.SECONDS)
                    .build();
        }
    

    step 4:

        @Provides
        @Singlton
        Retrofit provideRetrofit() {
            return new Retrofit.Builder()
                    .baseUrl(ApiConfig.BASE_URL) // this is default URl,
                    .addConverterFactory(provideConverterFactory())
                    .client(provideHttpClient())
                    .build();
        }
    

    Note: if the user has to change the Base URL from settings, remember to validate the newly created URL with below method:

        public final static boolean isValidUrl(CharSequence target) {
            if (target == null) {
                return false;
            } else {
                return Patterns.WEB_URL.matcher(target).matches();
            }
        }
    

提交回复
热议问题