You need to enable JavaScript to run this app. Volley请求NewsAPI返回403但浏览器可正常访问问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Volley请求NewsAPI返回403但浏览器可正常访问问题求助

403错误产生原因
  • NewsAPI免费版限制:官方免费开发者套餐仅允许请求从本地开发环境(浏览器、localhost服务)发起,移动端请求会被直接拦截返回403,属于平台的付费引导策略。
  • URL参数异常:从错误日志可见请求URL里的apiKey参数名被异常插入了空格(apiK 20ey里的20是空格的URL编码),服务端识别不到合法的密钥参数也会返回403。
  • 代码版本不匹配:你贴出的代码里from参数为2021-05-07,但错误日志里的from参数是2021-02-23,说明实际运行的可能是旧版本代码,存在参数配置错误的可能。
  • 缺少网络权限:如果AndroidManifest.xml里没有申请INTERNET权限,也可能触发403类的网络错误。
可行解决方案
  • 方案1:升级NewsAPI付费套餐,直接解除移动端请求限制,是官方支持的合规方案。
  • 方案2:新增后端代理层,自己搭建简单的后端接口,Android端请求自有后端,再由后端转发请求到NewsAPI,绕过平台的客户端类型校验。
  • 方案3:修复请求头模拟浏览器环境,构造Volley请求时手动添加浏览器UA头,绕过基础的客户端识别拦截,参考修改代码如下:
fun getNews(context: Context){
    var queue: RequestQueue = Volley.newRequestQueue(context)
    val url = "https://newsapi.org/v2/everything?q=tesla&from=2021-05-07&sortBy=publishedAt&apiKey=c9e4ed47388d413c8af23fc46a330f8e"
    // 自定义请求类重写getHeaders方法
    val request = object : JsonObjectRequest(
        Request.Method.GET, url, null,
        { response ->
            var list: MutableList<newModel> = mutableListOf<newModel>()
            try {
                var rootArray: JSONArray = response.getJSONArray("articles")
                // 修复原有遍历逻辑错误,原来的response.length()是JSONObject的长度,不是数组长度
                for(i in 0 until rootArray.length()){
                    var dataObject: JSONObject = rootArray.get(i) as JSONObject
                    list.add(newModel(dataObject.getString("urlToImage") , dataObject.getString("title") , dataObject.getString("description") , dataObject.getString("url")))
                }

            } catch (e: Exception) {
                Toast.makeText(
                    context,
                    "error while parsing the jsonObject/array",
                    Toast.LENGTH_LONG
                ).show()
            }
            callBack.gotTheNewsData(list)
        }) { error ->
        Toast.makeText(context, "Error in responce", Toast.LENGTH_SHORT).show()
    } {
        override fun getHeaders(): MutableMap<String, String> {
            val headers = HashMap<String, String>()
            headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
            return headers
        }
    }
    queue.add(request)
}
  • 方案4:检查AndroidManifest.xml配置,确认已添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 04:45:08