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

