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

Retrofit调用数据时onResponse未执行仅触发onFailure问题排查

Retrofit 仅触发 onFailure 不执行 onResponse 问题排查方案

别着急,我帮你梳理几个常见的排查方向,一步步来定位问题:

1. 先把错误信息抓出来再说

很多人会忽略onFailure里的完整错误日志,这是定位问题的核心!你一定要在onFailure里打印完整的堆栈信息,而不只是简单的错误消息:

@Override
public void onFailure(Call<APIResponse<List<DataStatusSubscribe>>> call, Throwable t) {
    Log.e("RetrofitDebug", "请求失败详情", t); // 打印完整堆栈,能直接看到根因
    Toast.makeText(YourActivity.this, "失败原因: " + t.getMessage(), Toast.LENGTH_LONG).show();
}

常见的错误类型对应不同问题:

  • IOException:网络连接类问题(域名解析失败、设备没网、请求超时)
  • HttpException:请求已到达服务器,但返回非2xx状态码(比如404接口不存在、500服务器内部崩溃)
  • JsonSyntaxException:JSON解析与你的实体类结构不匹配

2. 检查基础配置与网络权限

  • 先确认设备网络正常:打开浏览器访问任意网站,排除本地网络故障
  • 核对AndroidManifest.xml的网络权限:必须添加以下权限才能发起网络请求
    <uses-permission android:name="android.permission.INTERNET" />
    
    如果你的targetSdkVersion≥28且使用明文http,还需要在res/xml/network_security_config.xml中配置允许明文请求,否则会被系统拦截
  • 检查Retrofit初始化的baseUrl:有没有写错域名?有没有漏加http://或https://?比如把https://api.example.com写成api.example.com会直接导致连接失败

3. 验证请求参数与接口定义是否匹配

  • 检查传入的own.msisdn参数:格式是否符合后端要求?比如后端需要带国家码(如+8613xxxxxx),你只传了13xxxxxx,可能会触发接口错误返回
  • 对比Retrofit接口与后端接口的定义:
    假设你的ServicesFactory接口是这样的:
    @GET("user/subscribe/status")
    Call<APIResponse<List<DataStatusSubscribe>>> getStatusSubscribe(@Query("msisdn") String msisdn);
    
    要确认:
    • 请求方式(GET/POST)与后端完全一致
    • 参数名(msisdn)与后端接口的参数名完全匹配
    • 参数位置(Query/Body/Path)正确,比如后端要求参数在请求体里,你用了@Query就会出错

4. 抓包查看真实请求与响应

用Charles或Fiddler抓包,能直观看到:

  • 请求是否真的发送出去?如果没发送,大概率是本地配置或网络问题
  • 如果请求已发送,服务器返回的状态码是多少?401代表权限验证失败,404代表接口路径错误,500代表服务器内部故障
  • 服务器返回的JSON格式是否与你的APIResponse、DataStatusSubscribe实体类匹配?比如后端返回字段是subscribed,你的实体类字段是isSubscribed且未加@SerializedName注解,就会解析失败触发onFailure

5. 其他容易忽略的细节

  • 超时设置:Retrofit默认超时时间较短,如果接口响应慢,会触发超时失败,可以初始化OkHttpClient时设置更长的超时:
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .writeTimeout(30, TimeUnit.SECONDS)
            .build();
    
  • SSL证书问题:如果后端是HTTPS且使用自签名证书,默认OkHttpClient会拒绝连接,需要配置忽略证书或导入合法证书

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:39:39