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的网络权限:必须添加以下权限才能发起网络请求
如果你的targetSdkVersion≥28且使用明文http,还需要在<uses-permission android:name="android.permission.INTERNET" />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
相关产品推荐
相关产品推荐

