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

Retrofit POST请求未携带Body参数问题排查

问题原因及解决方案

核心问题在于Android端发送的JSON结构与PHP API期望的结构不匹配,具体分析和解决如下:

场景1:Postman测试时直接传User对象JSON(无外层user字段)

如果Postman请求体是类似这样的结构:

{
  "email": "test@example.com",
  "name": "test",
  "password": "123456"
}

那问题出在PHP代码的取值逻辑错误——你在PHP里尝试从$data->user下获取属性,但Retrofit发送的JSON中,name、email等都是顶层属性,没有外层user字段。

修改PHP代码的判断部分即可:

if ($data != null) {
    // 直接访问顶层属性,而非$data->user下的属性
    if (!empty($data->name) && !empty($data->email) && !empty($data->password)) {
        // 正常处理逻辑
    } else {
        $result->setErrorStatus(true);
        $result->setMessage("insufficient parameters");
    }
}

场景2:Postman测试时请求体带外层user字段

如果Postman请求体是类似这样的嵌套结构:

{
  "user": {
    "email": "test@example.com",
    "name": "test",
    "password": "123456"
  }
}

那Android端需要调整数据结构,匹配API的嵌套要求:

  1. 创建一个包裹类:
data class UserRequest(val user: User)
  1. 修改Retrofit接口:
@POST(URLs.REGISTER)
suspend fun registerUser(@Body userRequest: UserRequest) : Response<Result>
  1. 更新ViewModel调用:
suspend fun registerUser(user: User) : Response<Result> {
    return RetrofitInstance.api.registerUser(UserRequest(user))
}

额外验证步骤

  1. 用抓包工具(如Charles、Fiddler)查看Android发送的请求体,确认JSON结构是否和Postman一致,这能快速定位结构差异。
  2. 确认Retrofit实例已正确添加JSON转换器(比如Gson),否则无法将User对象序列化为正确的JSON:
val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:07:16