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的嵌套要求:
- 创建一个包裹类:
data class UserRequest(val user: User)
- 修改Retrofit接口:
@POST(URLs.REGISTER) suspend fun registerUser(@Body userRequest: UserRequest) : Response<Result>
- 更新ViewModel调用:
suspend fun registerUser(user: User) : Response<Result> { return RetrofitInstance.api.registerUser(UserRequest(user)) }
额外验证步骤
- 用抓包工具(如Charles、Fiddler)查看Android发送的请求体,确认JSON结构是否和Postman一致,这能快速定位结构差异。
- 确认Retrofit实例已正确添加JSON转换器(比如Gson),否则无法将User对象序列化为正确的JSON:
val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build()
内容的提问来源于stack exchange,提问作者user1Tech
相关产品推荐
相关产品推荐

