BUG解决要点
-
@POST + @Body必须写 -
NetworkResponse<T>必须是@Serializable data class -
Auth必须@Serializable -
不要用 sealed / Any
哪怕 Auth 是 @Serializable,只要 NetworkResponse 有下面任意一条,就一定失败:
- ❌ 没有
@Serializable - ❌ 是
sealed class - ❌ 是
open class - ❌ 有
Any/Map<String, Any> - ❌ 泛型
T没有限定 - ❌ 有自定义构造逻辑
Retrofit 会在创建接口代理时直接抛这个异常。
gradle(非常关键,很多人漏)
js
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0")
}
js
plugins {
id("org.jetbrains.kotlin.plugin.serialization")
}
代码示例
如果是Body的JSON请求,必须添加**@Body**
kotlin
interface AuthService {
@POST("login/password")
suspend fun loginByPassword(
@Body params: Map<String, String>
): NetworkResponse<Auth>
}
kotlin
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class NetworkResponse<T>(
@SerialName("code")
val code: Int,
@SerialName("message")
val message: String,
@SerialName("data")
val data: T? = null
)
kotlin
import kotlinx.serialization.Serializable
@Serializable
data class Auth(
val token: String,
val refreshToken: String,
val expire: Long
)
根因是 kotlinx.serialization 无法为 NetworkResponse 生成 Serializer