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

安卓调用NewsApi接口时出现Volley 403意外响应码异常求助

403报错核心触发原因
  • 鉴权逻辑不匹配:NewsAPI当前版本已全面废弃URL查询参数携带apiKey的鉴权方式,对该类请求直接返回403权限拒绝,强制要求通过请求头传递密钥
  • 查询范围越权:免费版NewsAPI仅支持查询请求发起日往前30天内的新闻内容,你代码中使用的2021-04-23的起始日期远超免费版回溯权限阈值,会触发服务端拦截
  • 缺少合规请求标识:直接从Android客户端发起的裸请求如果没有携带规范的请求头,会被NewsAPI的流量风控规则判定为非法爬虫请求,触发403拦截
  • 原代码存在URL截断问题:你写的URL字符串在2021-04-和23之间有硬换行,会导致字符串拼接错误,最终请求的URL参数不完整,触发服务端校验失败
可直接落地的修复方案
  1. 调整请求URL结构:将原本拼接在URL末尾的apiKey=xxx字段从地址中移除,删除URL字符串内的非法换行,保证查询参数完整连贯
  2. 重写JsonObjectRequest的请求头配置,将apiKey通过官方要求的X-Api-Key请求头传递
  3. 将查询的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 22:45:04