Android Studio(Java)天气APP调用WeatherAPI失败,始终触发onErrorResponse
问题排查与解决方案
以下是针对你用Volley调用WeatherAPI始终触发onErrorResponse的排查步骤:
1. 替换占位API密钥
代码里的API_KEY是占位符,必须替换成你从WeatherAPI官网获取的有效密钥。如果密钥无效,API会返回401错误,直接进入错误回调。
2. 改用HTTPS协议
WeatherAPI现在强制要求HTTPS访问,你当前用的是http://,会导致请求被拦截。把URL开头改成https://:
String url = "https://api.weatherapi.com/v1/forecast.json?key=你的密钥&q="+cityName+"&days=1&aqi=no&alerts=no";
3. 对城市名进行URL编码
直接拼接城市名到URL会有格式问题(比如带空格的城市名"Los Angeles"),需要用URLEncoder处理:
try { String encodedCity = URLEncoder.encode(cityName, "UTF-8"); String url = "https://api.weatherapi.com/v1/forecast.json?key=你的密钥&q="+encodedCity+"&days=1&aqi=no&alerts=no"; } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
4. 打印错误详情定位问题
当前错误回调只提示无效城市,但Volley的error对象包含具体错误信息。修改onErrorResponse,打印日志看真实错误:
@Override public void onErrorResponse(VolleyError error) { // 打印状态码和错误响应内容 if (error.networkResponse != null) { Log.e("WeatherError", "状态码: " + error.networkResponse.statusCode); try { String errorContent = new String(error.networkResponse.data, "UTF-8"); Log.e("WeatherError", "错误内容: " + errorContent); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } // 提示具体错误信息 Toast.makeText(MainActivity.this, "请求失败: " + error.getMessage(), Toast.LENGTH_SHORT).show(); }
常见错误码对应问题:
- 401:API密钥无效或过期
- 400:参数错误(比如城市名格式不对)
- 403:访问权限被限制
- 无网络响应:设备没联网或网络权限缺失
5. 检查网络权限
确保AndroidManifest.xml里添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
6. 解决Android 9+明文网络限制
如果你的APP目标SDK是28及以上,默认禁止明文HTTP请求。除了改用HTTPS,也可以配置网络安全策略允许访问WeatherAPI域名:
- 在
res/xml目录下创建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">api.weatherapi.com</domain> </domain-config> </network-security-config>
- 在
AndroidManifest.xml的application标签添加配置:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
内容的提问来源于stack exchange,提问作者Shubham
相关产品推荐
相关产品推荐

