使用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
相关产品推荐
相关产品推荐

