改造寻找不存在的参数?
Retrofit looking for non-existent param?
我正在使用改造在我的简单 API 调用中生成 POST 请求:
interface IRetrofitCommService {
@POST("pushnotifications/{entityId}")
suspend fun getNotificationsAsync(
@Path("entityId") entityId: Long,
@Body model: GetNotificationsDto
): Response<List<NotificationData>>
@POST("pushnotifications")
suspend fun registerDeviceAsync(@Body model: RegisterEntityDto):
Response<RegisterEntityResultDto>
}
注意,在第二次调用中,我只有1个参数,用@Body
注释标记。
然而,当我尝试使用网络调用时,我得到了这个异常:No annotation found for param 2
这是我创建调用的工厂:
object RetrofitFactory {
const val BASE_URL = "https://localhost:5051/api/"
fun createService(): IRetrofitCommService {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(IRetrofitCommService::class.java)
}
}
这是有问题的 DTO:
data class RegisterEntityDto(val name: String, val eventType: Short, val clientId: String)
那为什么要找第二个参数呢?我错过了什么?
我对 Retrofit 不是很熟悉,我在这里做了一个有根据的猜测,但在评论中进行了简短的讨论后,我的理解似乎是正确的。
在内部,Kotlin 中的 suspend
函数接收额外的 Continuation
参数。它始终是最后一个参数,并且在 Kotlin 代码中是隐藏的。但是,如果我们查看生成的字节码,我们会看到 registerDeviceAsync()
函数实际上接收 2 个参数。
如果我们使用的某些工具不了解挂起函数,它将无法正确解释此附加参数。它只会“认为”registerDeviceAsync()
有两个参数。 Retrofit 在版本 2.6.0
中添加了对挂起功能的支持,所以我想如果使用带有挂起功能的旧版本,我们将得到您所面临的行为。
您只需要将 Retrofit 更新到较新的版本。
我正在使用改造在我的简单 API 调用中生成 POST 请求:
interface IRetrofitCommService {
@POST("pushnotifications/{entityId}")
suspend fun getNotificationsAsync(
@Path("entityId") entityId: Long,
@Body model: GetNotificationsDto
): Response<List<NotificationData>>
@POST("pushnotifications")
suspend fun registerDeviceAsync(@Body model: RegisterEntityDto):
Response<RegisterEntityResultDto>
}
注意,在第二次调用中,我只有1个参数,用@Body
注释标记。
然而,当我尝试使用网络调用时,我得到了这个异常:No annotation found for param 2
这是我创建调用的工厂:
object RetrofitFactory {
const val BASE_URL = "https://localhost:5051/api/"
fun createService(): IRetrofitCommService {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(IRetrofitCommService::class.java)
}
}
这是有问题的 DTO:
data class RegisterEntityDto(val name: String, val eventType: Short, val clientId: String)
那为什么要找第二个参数呢?我错过了什么?
我对 Retrofit 不是很熟悉,我在这里做了一个有根据的猜测,但在评论中进行了简短的讨论后,我的理解似乎是正确的。
在内部,Kotlin 中的 suspend
函数接收额外的 Continuation
参数。它始终是最后一个参数,并且在 Kotlin 代码中是隐藏的。但是,如果我们查看生成的字节码,我们会看到 registerDeviceAsync()
函数实际上接收 2 个参数。
如果我们使用的某些工具不了解挂起函数,它将无法正确解释此附加参数。它只会“认为”registerDeviceAsync()
有两个参数。 Retrofit 在版本 2.6.0
中添加了对挂起功能的支持,所以我想如果使用带有挂起功能的旧版本,我们将得到您所面临的行为。
您只需要将 Retrofit 更新到较新的版本。