如何使用 Kotlin 和 Kodein 结构在 retrofit2 中有多个基 URL
How to have multiple base URL in retrofit2 using Kotlin and Kodein structure
我已遵循 THIS MVVM 教程和带有 Kodein 的 Retrofit2 structure/framework。我想知道,使用相同的 framework/structure 如何在单个应用程序中拥有多个基本 URL。
下面是 "MyApi" 接口的代码,它有一个拦截器 class 作为参数。
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)
}
}
这是我在应用程序中初始化 MyApi 接口的方式 class:
bind() from singleton { PreferenceProvider(instance()) }
bind() from singleton { NetworkConnectionInterceptor(instance(), instance()) }
bind() from singleton { MyApi(instance()) }
这里MyApi中的instance()显然是NetworkConnectionInterceptor
我在 Whosebug 和 medium 上看到了很多例子,但我没有得到任何帮助。
我想我找到了解决这个问题的方法。有两种解决方案...
第一个解:
- 您可以为其他微服务(基础url)创建一个新接口并像第一个一样使用它。现在有一些优点和缺点。
优点:
- 两个接口将相互独立。
- 您可以根据需要在同一 activity 中使用其中一个界面或同时使用这两个界面。
缺点:
- 如果弹出另一个微服务,您必须为此再创建一个接口。
- 如果您甚至需要 2 个微服务,并且您必须 运行
development
和 qa
服务器上的相同应用程序,为测试人员和开发人员提供在质量检查和开发服务器之间切换的选项在 运行 的时候你需要有 4 个接口和 2 个额外的 production
这意味着 6 个接口,这将变得非常需要管理它。
第二种解法:
- 可以使用retrofit2提供的
@URL
注解。现在,如果你这样做,就不会有 base_url,你必须在一个通用函数中传递 URL 和微服务名称,这将 return 你一个完整的 URL 基于什么服务器 users/testers 开启(dev/qa 或产品)。
优点:
- 没有额外的接口,只有一个就可以了。
- 所有 API 调用的管理都很简单,因为它们具有共同的功能。
缺点:
- 您必须在每次 API 调用中调用
@URL
注释中的公共函数。
- 我再也看不到了。
我已遵循 THIS MVVM 教程和带有 Kodein 的 Retrofit2 structure/framework。我想知道,使用相同的 framework/structure 如何在单个应用程序中拥有多个基本 URL。
下面是 "MyApi" 接口的代码,它有一个拦截器 class 作为参数。
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)
}
}
这是我在应用程序中初始化 MyApi 接口的方式 class:
bind() from singleton { PreferenceProvider(instance()) }
bind() from singleton { NetworkConnectionInterceptor(instance(), instance()) }
bind() from singleton { MyApi(instance()) }
这里MyApi中的instance()显然是NetworkConnectionInterceptor
我在 Whosebug 和 medium 上看到了很多例子,但我没有得到任何帮助。
我想我找到了解决这个问题的方法。有两种解决方案...
第一个解:
- 您可以为其他微服务(基础url)创建一个新接口并像第一个一样使用它。现在有一些优点和缺点。
优点:
- 两个接口将相互独立。
- 您可以根据需要在同一 activity 中使用其中一个界面或同时使用这两个界面。
缺点:
- 如果弹出另一个微服务,您必须为此再创建一个接口。
- 如果您甚至需要 2 个微服务,并且您必须 运行
development
和qa
服务器上的相同应用程序,为测试人员和开发人员提供在质量检查和开发服务器之间切换的选项在 运行 的时候你需要有 4 个接口和 2 个额外的production
这意味着 6 个接口,这将变得非常需要管理它。
第二种解法:
- 可以使用retrofit2提供的
@URL
注解。现在,如果你这样做,就不会有 base_url,你必须在一个通用函数中传递 URL 和微服务名称,这将 return 你一个完整的 URL 基于什么服务器 users/testers 开启(dev/qa 或产品)。
优点:
- 没有额外的接口,只有一个就可以了。
- 所有 API 调用的管理都很简单,因为它们具有共同的功能。
缺点:
- 您必须在每次 API 调用中调用
@URL
注释中的公共函数。 - 我再也看不到了。