You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin使用Retrofit发起POST请求时email参数未传递问题排查

解决方案

问题核心是Gson序列化newGame对象时,email字段未被写入最终请求JSON,可按以下步骤排查解决:

  1. 先确认APP实际发出的请求内容
    添加拦截器打印完整请求体,确认是否APP端发送时就丢失了email字段:
    首先导入日志拦截器依赖(build.gradle):
implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'

修改CreateGame接口的create方法:

fun create(): CreateGame {
    val loggingInterceptor = HttpLoggingInterceptor()
    loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
    val okHttpClient = OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .build()

    val retrofit = Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(BaseURL)
        .client(okHttpClient)
        .build()
    return retrofit.create(CreateGame::class.java)
}

运行后查看logcat输出的请求body,如果确实没有email字段,按下一步排查序列化问题。

  1. 排查序列化异常原因
  • 检查newGame类的email字段是否添加了@Transient、@JsonIgnore这类会跳过序列化的注解,如有直接删除即可。
  • 如果你项目中Gson设置了excludeFieldsWithoutExposeAnnotation()规则,所有未加@Expose注解的字段都会被忽略,给email字段添加@Expose注解即可。
  • 检查混淆配置,确保newGame和内部的Player类没有被混淆,在proguard-rules.pro中添加对应keep规则:
-keep class 你的实际包名.newGame { *; }
-keep class 你的实际包名.newGame$Player { *; }
  1. 快速修复方案
    如果排查不到具体原因,可以直接给email字段加@SerializedName注解强制指定序列化键名,绝大多数场景下都可以直接解决字段丢失问题:
data class newGame(
  var gamename: String? = null,
  @SerializedName("email")
  var email: String? = null,
  var event_id: Int? = 0,
  var gamedate: String? = "1900-01-01",
  var players: ArrayList<Player> = ArrayList()
) {
  // 内部Player类代码保持不变
}

内容的提问来源于stack exchange,提问作者Tim Foster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:24:02