Kotlin使用Retrofit发起POST请求时email参数未传递问题排查
解决方案
问题核心是Gson序列化newGame对象时,email字段未被写入最终请求JSON,可按以下步骤排查解决:
- 先确认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字段,按下一步排查序列化问题。
- 排查序列化异常原因
- 检查
newGame类的email字段是否添加了@Transient、@JsonIgnore这类会跳过序列化的注解,如有直接删除即可。 - 如果你项目中Gson设置了
excludeFieldsWithoutExposeAnnotation()规则,所有未加@Expose注解的字段都会被忽略,给email字段添加@Expose注解即可。 - 检查混淆配置,确保
newGame和内部的Player类没有被混淆,在proguard-rules.pro中添加对应keep规则:
-keep class 你的实际包名.newGame { *; } -keep class 你的实际包名.newGame$Player { *; }
- 快速修复方案
如果排查不到具体原因,可以直接给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
相关产品推荐
相关产品推荐

