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

使用Volley调用API遇403错误及代码问题求助

问题分析与解决方案

核心问题定位

错误日志中Volley请求返回403状态码是数据无法加载的根本原因,OpenGL相关报错属于系统渲染层面的警告,与当前新闻加载问题无关。另外存在未使用的导入import com.android.volley.Response,可直接删除。

403错误的解决方法

1. 修复API Key访问限制

NewsAPI免费版Key仅允许在localhost或指定域名下使用,Android真机/模拟器直接请求会被拦截。解决方式:

  • 登录NewsAPI后台,将你的测试设备IP或应用包名添加到允许列表;
  • 若使用免费版,可改用支持公网请求的测试API,或升级付费版。

2. 添加必要请求头

NewsAPI要求请求携带User-Agent头,否则会拒绝访问。修改Volley请求代码:

private fun fetchdata() {
    val url = "https://newsapi.org/v2/top-headlines?country=us&apiKey=6c0cb81d850c49c0a8cfafc5457c8836"
    val jsonObjectRequest = object : JsonObjectRequest(
        Request.Method.GET, url,
        null,
        { response ->
            val newsJasonArray = response.getJSONArray("articles")
            val newsArray = ArrayList<News>()
            for(i in 0 until newsJasonArray.length()){
                val newsJasonObject = newsJasonArray.getJSONObject(i)
                val news = News(
                    newsJasonObject.getString("title"),
                    newsJasonObject.getString("author"),
                    newsJasonObject.getString("url"),
                    newsJasonObject.getString("urlToImage")
                )
                newsArray.add(news)
            }
            mAdapter.updateNews(newsArray)
        },
        { error ->
            Log.e("MainActivity", "请求失败: ${error.message}")
        }
    ) {
        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/91.0.4472.124 Safari/537.36"
            return headers
        }
    }

    MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest)
}

3. 调整初始化顺序

当前代码先发起请求再初始化Adapter,虽不会直接崩溃,但逻辑上应先初始化Adapter再请求,避免潜在空指针:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val re = findViewById<RecyclerView>(R.id.recyclerView)
    re.layoutManager = LinearLayoutManager(this)
    // 先初始化Adapter
    mAdapter = News_Adapter(this)
    re.adapter = mAdapter
    // 再发起数据请求
    fetchdata()
}

额外优化建议

  • 删除未使用的import com.android.volley.Response,精简代码;
  • 优化Adapter更新方法,用notifyItemRangeChanged替代notifyDataSetChanged提升性能:
fun updateNews(updatednews: ArrayList<News>){
    items.clear()
    items.addAll(updatednews)
    notifyItemRangeChanged(0, items.size)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:05:27