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

Kotlin中将Retrofit2 POST请求的Query参数改为Body参数问题

Retrofit2 POST请求从Query参数改为Body参数修改指南

第一步:完善请求实体类User

你现有的User类未声明构造参数为类成员,无法被序列化框架读取内容,修改为可序列化的data class:

data class User(
    val email: String,
    val password: String
)

第二步:修改Retrofit接口定义

将原有@Query参数替换为@Body注解标注的User类型参数:

import retrofit2.Call
import retrofit2.http.*

interface PostInterface {
    @POST("signin")
    fun signIn(@Body user: User): Call<String>
}

第三步:修改Repo层调用逻辑

调用signIn方法时传入构造好的User实例即可,原有回调逻辑无需修改,同时补齐原有代码缺失的必写方法和返回值避免编译错误:

class BasicRepo @Inject constructor(val postInterface: PostInterface) {

   fun signIn(email: String, password: String): MutableLiveData<Resource> {
       val status: MutableLiveData<Resource> = MutableLiveData()
       status.value = Resource.loading(null)
       // 传入构造的User对象代替原有两个字符串参数
       postInterface.signIn(User(email, password)).enqueue(object : Callback<String> {
           override fun onResponse(call: Call<String>, response: Response<String>) {
                 if (response.code() == 200 || response.code() == 201) {
                     // 原有逻辑保持不变
                 } else {
                    // 原有逻辑保持不变
                 }
            }
           // 原有代码缺失onFailure重写,必须补充否则会报语法错误
           override fun onFailure(call: Call<String>, t: Throwable) {
               status.value = Resource.error(t.message ?: "请求失败", null)
           }
        })
       // 原有代码缺失返回值,补充后避免语法错误
       return status
     }
}

注意事项

  • 初始化Retrofit时必须添加JSON序列化转换器,比如Gson转换器:addConverterFactory(GsonConverterFactory.create()),否则无法将User对象自动序列化为JSON请求体。
  • 若后端接口要求接收表单格式的请求体,需要改用@FormUrlEncoded + @Field的写法,和当前JSON Body逻辑不同。

内容的提问来源于stack exchange,提问作者14079_Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:36:03