安卓调用NewsApi接口时出现Volley 403意外响应码异常求助
403报错核心触发原因
- 鉴权逻辑不匹配:NewsAPI当前版本已全面废弃URL查询参数携带
apiKey的鉴权方式,对该类请求直接返回403权限拒绝,强制要求通过请求头传递密钥 - 查询范围越权:免费版NewsAPI仅支持查询请求发起日往前30天内的新闻内容,你代码中使用的2021-04-23的起始日期远超免费版回溯权限阈值,会触发服务端拦截
- 缺少合规请求标识:直接从Android客户端发起的裸请求如果没有携带规范的请求头,会被NewsAPI的流量风控规则判定为非法爬虫请求,触发403拦截
- 原代码存在URL截断问题:你写的URL字符串在
2021-04-和23之间有硬换行,会导致字符串拼接错误,最终请求的URL参数不完整,触发服务端校验失败
可直接落地的修复方案
- 调整请求URL结构:将原本拼接在URL末尾的
apiKey=xxx字段从地址中移除,删除URL字符串内的非法换行,保证查询参数完整连贯 - 重写
JsonObjectRequest的请求头配置,将apiKey通过官方要求的X-Api-Key请求头传递 - 将查询的
from日期调整为当前时间往前30天内的有效日期,避免触发回溯权限限制
修复后的参考代码:
// 移除URL中的apiKey参数,修复换行截断问题 String url = "https://newsapi.org/v2/everything?q=Apple&from=2024-01-01&sortBy=popularity"; JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url, null, response -> Log.d("show", "Response came "), error -> Log.d("show", "No response") ) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); // 通过请求头传递apiKey,不再拼接到URL上 headers.put("X-Api-Key", "1ea1cbe36dfdcb846a6f885593f95"); headers.put("User-Agent", "Mozilla/5.0 (Android)"); return headers; } }; MySingleton.getInstance(this).addToRequestQueue(req);
额外排查提示:如果调整后仍返回403,可登录NewsAPI个人后台确认apiKey是否因之前的高频异常请求被临时限流,这类限流一般会在1小时后自动解除。
内容的提问来源于stack exchange,提问作者MobixProd
相关产品推荐
相关产品推荐

