使用PHP Slim构建Android REST API时Retrofit响应失败问题排查
Troubleshooting Retrofit onFailure When Receiving Response from Slim PHP API
看起来你已经搞定了数据写入MySQL的核心逻辑,但卡在了响应解析导致Retrofit触发onFailure——这在API开发里是很常见的细节问题,咱们一步步排查:
1. 最可能的原因:无效的JSON格式
你返回的{success:'yes'}不符合标准JSON语法!JSON要求字符串必须用双引号包裹,单引号是不被官方规范允许的。Retrofit的JSON转换器(比如Gson、Moshi)会因为这个格式错误直接抛出解析异常,进而触发onFailure。
修复方式:
把响应内容改成标准JSON:
$response->getBody()->write('{"success":"yes"}');
或者更省心的是用Slim框架自带的withJson方法,它会自动处理格式和Content-Type:
return $response->withJson(['success' => 'yes'], 200);
这个方法不仅能保证JSON格式绝对正确,还会自动设置Content-Type: application/json,不用手动写header,避免遗漏或写错。
2. 检查Slim响应的返回逻辑
确保你在PHP代码里正确返回了构建好的响应对象,而不是只写了Body却没返回。比如:
// 正确的写法示例 $app->post('/your-endpoint', function ($request, $response, $args) { // 写入MySQL的业务逻辑... // 必须return构建好的响应对象 return $response->withJson(['success' => 'yes'], 200); });
如果没有return这个响应对象,Slim可能会默认返回空响应或者错误的状态码,导致Retrofit无法正常解析。
3. 排查Retrofit端的配置与模型类
- 确保你的Retrofit实例添加了JSON转换器,比如Gson:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build();
- 检查你的响应模型类是否和返回的JSON严格匹配,比如:
public class ApiResponse { private String success; // 字段名要和JSON里的"success"完全一致,大小写敏感 public String getSuccess() { return success; } public void setSuccess(String success) { this.success = success; } }
如果字段名不匹配,或者缺少getter/setter,也可能导致解析失败触发onFailure。
4. 用调试工具确认响应内容
可以用Postman或者curl直接请求你的API端点,看看返回的响应是否符合预期:
curl -X POST http://your-api-url/your-endpoint -d "your-post-data"
重点检查响应的状态码(应该是200 OK)和响应体是否是标准JSON。如果这里返回的内容有问题,那问题肯定在PHP端;如果这里是正常的,再去排查Retrofit的配置细节。
内容的提问来源于stack exchange,提问作者keremoflu4
相关产品推荐
相关产品推荐

