Невозможно изменить модифицированную базовую ссылку более одного раза с отражением - PullRequest
0 голосов
/ 17 октября 2018

Я использую отражение для изменения базового URL для динамического изменения, но я могу изменить один раз в активности, после чего я не могу изменить его.Почему это не работает, когда я пытаюсь изменить несколько раз.

Установить динамический базовый URL, используя Retrofit 2.0 и Dagger 2

Я не знаю домен, который я просто знаюконечные точки, я получаю адрес домена от пользователя.

1 Ответ

0 голосов
/ 17 октября 2018

Просто используйте разные модули и API для разных URL.А затем используйте аннотацию @Named для определения правильного API.Модуль Api с HOST url

@Module
class ApiModule {
    @Provides
    @Singleton
    @Named("Interceptor")
    fun provideInterceptor(context: Context, sharedPrefsStorage: SharedPrefsStorage, @Named("ApiAuth") apiAuth: ApiAuth,realmProvider: DbProvider<Realm>): Interceptor {
        return ApiInterceptor(context, sharedPrefsStorage, apiAuth,realmProvider)
    }

    @Provides
    @Singleton
    @Named("HttpClient")
    fun provideOkHttpClient(@Named("Interceptor") interceptor: Interceptor): OkHttpClient {
        val builder = OkHttpClient.Builder()
        builder.addInterceptor(interceptor)
        builder.readTimeout(30, TimeUnit.SECONDS)
        builder.connectTimeout(30, TimeUnit.SECONDS)

            val loggingInterceptor = HttpLoggingInterceptor()
            loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
            builder.addInterceptor(loggingInterceptor)
        return builder.build()
    }

    @Provides
    @Singleton
    @Named("Retrofit")
    fun provideRetrofitBuilder(@Named("HttpClient") okHttpClient: OkHttpClient): Retrofit.Builder {
        return Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(
                        GsonBuilder()
                                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                                .create()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .baseUrl(BuildConfig.HOST)
    }


    @Provides
    @Singleton
    @Named("Api")
    fun provideApi(@Named("Retrofit") builder: Retrofit.Builder): Api {
        return builder.build().create<Api>(Api::class.java)
    }

    companion object {
        val TAG = ApiModule::class.java.simpleName
    }

}

ApiAuthModule с HOST_2 url

@Module
class ApiAuthModule {
    @Provides
    @Singleton
    @Named("InterceptorAuth")
    fun provideInterceptor(): Interceptor {
        return ApiAuthInterceptor()
    }

    @Provides
    @Singleton
    @Named("HttpClientAuth")
    fun provideOkHttpClient(@Named("InterceptorAuth") interceptor: Interceptor): OkHttpClient {
        val builder = OkHttpClient.Builder()
        builder.addInterceptor(interceptor)
        builder.readTimeout(5, TimeUnit.SECONDS)
        builder.connectTimeout(5, TimeUnit.SECONDS)

        if (BuildConfig.DEBUG) {
            val loggingInterceptor = HttpLoggingInterceptor()
            loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
            builder.addInterceptor(loggingInterceptor)
        }
        return builder.build()
    }

    @Provides
    @Singleton
    @Named("RetrofitAuth")
    fun provideRetrofitBuilder(@Named("HttpClientAuth") okHttpClient: OkHttpClient): Retrofit.Builder {
        return Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(
                        GsonBuilder()
                                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                                .create()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .baseUrl(BuildConfig.HOST_2)
    }


    @Provides
    @Singleton
    @Named("ApiAuth")
    fun provideApi(@Named("RetrofitAuth") builder: Retrofit.Builder): ApiAuth {
        return builder.build().create<ApiAuth>(ApiAuth::class.java)
    }

    companion object {
        val TAG = ApiModule::class.java.simpleName
    }
}

Использование в AppModule:

  @Provides
  @Singleton
  fun worksRepository(@Named("Api") api: Api, @Named("ApiAuth") api2: ApiAuth): IWorksRepository {
        return WorksRepository(api, api2)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...