【发布时间】:2018-12-03 14:41:09
【问题描述】:
我正在使用 Kotlin 编写一个集成 Retrofit2 的 Android 应用。
据我了解(如果我错了,请纠正我),这样做的“传统”方式是:
- 创建一个接口,其中包括我所有 API 的方法定义。
- 使用 retrofit.create() 将其传递给改造,它为我实现了它,然后我可以使用步骤 #1 中的函数访问所有这些
看了this之后,我的问题是: 为我的每个请求创建单独的接口是否更好?
例如如果我有一个“LoginRequest”,并如下所示实现它(“create”本质上调用retrofit.create()),下次我想添加/删除API时,我只需要添加/删除1个文件,而不是几个地方(请求本身、步骤#1 中的服务,以及使用步骤#2 中的方法的所有地方)。另一方面,这会导致我的应用程序“知道”retrofit2,我也不确定这是否是一个好习惯。
interface MyRequest {
fun execute()
}
class LoginRequest (private val email: String, private val password: String) : MyRequest {
interface LoginRequestService {
@POST("login")
fun emailLogin(
@Body loginRequestBody: LoginRequestBody):
retrofit2.Call<GetUserDetailsResponse>
}
override fun execute() {
val requestBody = LoginRequestBody(email, password)
val call = MyRequestManager.create(LoginRequestService::class.java).emailLogin(requestBody)
MyRequestManager.executeCall(call)
}
}
【问题讨论】:
-
我以前从未见过改造的这种实现。遵循官方指南有什么问题? square.github.io/retrofit
-
我想这里的一件好事(?)是您可以避免一个单一的服务定义接口文件,并且一切都可以分开。但是,与其将服务作为执行的一部分,它应该是类的静态成员
-
Is it a better practice to create a separate interface for each of my requests?不,我以前做过,然后花了一些时间将它们重新组合在一起。只有为每个 baseUrl(或不同的 OkClients)创建一个接口才有意义。 -
另外,根据请求创建一个新的改造实现绝对不是一个更好的做法。