意外的响应代码 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

REST API端点在react中使用axios时不返回任何响应,但在浏览器中却能正常工作。

不可变的 JS - getIn() 返回未定义但在浏览器的控制台中工作