1

我已经按照MVVM 和 Retrofit2 的这个教程使用了 Kodein 结构/框架。我想知道,使用相同的框架/结构,我如何在单个应用程序中拥有多个基本 URL。

下面是“MyApi”接口的代码,其中有一个拦截器类作为参数。

companion object {
    operator fun invoke(
        networkConnectionInterceptor: NetworkConnectionInterceptor
    ): MyApi {

        val okkHttpclient = OkHttpClient.Builder()
            .addInterceptor(networkConnectionInterceptor)
            .readTimeout(20, TimeUnit.SECONDS)
            .build()

        return Retrofit.Builder()
            .client(okkHttpclient)
            .baseUrl("http://my-base-url")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(MyApi::class.java)
    }
}

以下是 Iam 在 Application 类中初始化 MyApi 接口的方式:

    bind() from singleton { PreferenceProvider(instance()) }
    bind() from singleton { NetworkConnectionInterceptor(instance(), instance()) }
    bind() from singleton { MyApi(instance()) }

这里 MyApi 中的 instance() 显然是 NetworkConnectionInterceptor。

我在 stackoverflow 和 medium 上看到了很多例子,但我没有得到任何帮助。

4

1 回答 1

1

我想我找到了解决这个问题的方法。有两种解决方案...

第一个解决方案:

  • 您可以为其他微服务(基本 url)创建一个新接口,并像第一个一样使用它。现在有一些优点和缺点。

优点:

  • 两个接口将相互独立。
  • 您可以根据需要在同一活动中使用任一界面或两者。

缺点:

  • 如果弹出另一个微服务,您必须为此创建一个更多接口。
  • 如果您甚至需要 2 个微服务,并且您必须在服务器上运行相同的应用程序,developmentqa为测试人员和开发人员在运行时在 qa 和 dev 服务器之间切换提供选项,那么您需要有 4 个接口和 2 个额外的production接口,这意味着 6 个接口,它将变得非常不得不管理它。

第二种解决方案:

  • 您可以使用@URLretrofit2 提供的注释。现在,如果您这样做,将没有 base_url,您必须在一个通用函数中传递 URL 和微服务名称,该函数将根据服务器用户/测试人员所在的服务器(dev/qa 或 prod)返回一个完整的 URL。

优点:

  • 没有额外的接口,只有一个可以解决。
  • 由于通用功能,易于管理所有 API 调用。

缺点:

  • 您必须@URL在每个 API 调用中调用注释中的常用功能。
  • 我再也看不到了。
于 2019-08-07T05:24:22.047 回答