意外的响应代码 403(但在浏览器中工作正常)
Posted
技术标签:
【中文标题】意外的响应代码 403(但在浏览器中工作正常)【英文标题】:Unexpected response code 403 (But work fine in browser) 【发布时间】:2021-08-24 17:38:49 【问题描述】:我正在尝试从以下 URL 获取 json 数据
https://newsapi.org/v2/everything?q=tesla&from=2021-05-07&sortBy=publishedAt&apiKey=c9e4ed47388d413c8af23fc46a330f8e
但是当我运行应用程序时它会显示
31029-31125 E/Volley: [228776] NetworkUtility.shouldRetryException: Unexpected response code 403 for https://newsapi.org/v2/everything?q=tesla&from=2021-02-23&sortBy=publishedAt&apiK 20ey=c9e4ed47388d413c8af23fc46a330f8e
31029-31125 E/Volley: [228776] NetworkUtility.shouldRetryException: Unexpected response code 403 for https://newsapi.org/v2/everything?q=tesla&from=2021-02-23&sortBy=publishedAt&apiK 20ey=c9e4ed47388d413c8af23fc46a330f8e
但是当我在 chrome 浏览器中输入 URL 时,它会正常显示 json 数据,但我在我的应用程序中得到了同样的结果 这是我在 kotlin 中的代码
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"
val request = JsonObjectRequest(
Request.Method.GET, url, null,
response ->
var list: MutableList<newModel> = mutableListOf<newModel>()
try
var rootArray: JSONArray = response.getJSONArray("articles")
for(i in 0 until response.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()
queue.add(request)
【问题讨论】:
您刚刚将您的 api 密钥发布到互联网上,因此现在任何人都可以使用它。希望不会有什么影响 仅供测试 你能打印出错误回调中的错误吗?它应该包含更多关于出了什么问题的信息? com.android.volley.AuthFailureError 即使是为了测试,您现在也需要生成一个新密钥并使您发布的密钥无效... 【参考方案1】:我遇到了同样的错误,我通过将标头 "Mozilla/5.0" 传递给请求来解决它。
这可以在您的代码上以这种方式完成。
fun getNews(context: Context)
var queue: RequestQueue = Volley.newRequestQueue(context)
val url = "Your URL here"
val request = object: JsonObjectRequest(
Request.Method.GET, url, null,
response ->
var list: MutableList<newModel> = mutableListOf<newModel>()
try
var rootArray: JSONArray = response.getJSONArray("articles")
for(i in 0 until response.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()
// overriding function to add Headers.
override fun getHeaders(): MutableMap<String, String>
val headers = HashMap<String, String>()
headers["User-Agent"]="Mozilla/5.0"
return headers
queue.add(request)
在构造请求之前使用 object 关键字很重要,以便能够覆盖 getHeaders() 方法。
This answer 帮助我在使用 kotlin 的 Volley 请求中添加了自定义标头。
【讨论】:
这很有帮助。谢谢你:)【参考方案2】:-
覆盖标头 ["User-Agent"]="Mozilla/5.0"
或者您可以使用不需要 apikey 的 NewsApi
https://github.com/SauravKanchan/NewsAPI
【讨论】:
请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。以上是关于意外的响应代码 403(但在浏览器中工作正常)的主要内容,如果未能解决你的问题,请参考以下文章
Ionic - $http 在移动设备中工作,但在浏览器中显示 CORS 和预检错误
Twilio 的 PHP 代码在终端中工作,但在浏览器中不工作
网页设计在直接 IE 浏览中工作,但在通过 IIS 查看时失败
GET 请求在浏览器中工作,但在 curl 中给出错误 SSL_ERROR_SYSCALL