【发布时间】:2019-09-10 09:54:42
【问题描述】:
我有一个 Laravel 应用程序,我在 VueJS 组件中使用 axios 在单击按钮时将 GET 请求发送到外部公共 API,但它会引发以下错误:
[Error] Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.
[Error] XMLHttpRequest cannot load http://api.icndb.com/jokes/random due to access control checks.
[Error] Failed to load resource: Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers. (random, line 0)
这是我失败的尝试:
const url = "http://api.icndb.com/jokes/random";
const response = await axios.get(url);
我只是应该收到一些 Chuck Norris 的笑话来打印在控制台上......
PS:我已经看到了一些关于 CORS 的事实,但我没有从中得到任何东西,所以我在这里。
【问题讨论】:
-
axios 默认不设置该标头。然而,Laravel 在某处确实有
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';这条线。你应该删除它。这通常是不好的做法 -
好的,我马上去找!但是......为什么这是一个不好的做法,为什么 Laravel 使用它?
-
那么故事是这样的:(1) 该标头由 jQuery.ajax 发送 (2) Laravel 设置它,因为服务器端遗留代码使用
Request::isAjax很多,这依赖于现有的标头。这是不好的做法,因为 (1)XMLHttpRequest不是我们可能用来执行 ajax 的唯一请求,axios 可能暂时环绕XMLHttpRequest但还有fetch(2) 服务器不应该关心请求是否是以 AJAX 或其他方式传入。 -
你的 API 是在 laravel 中创建的吗?如果您在 laravel 中创建 api,则需要为它创建一个跨中间件。
-
我还没有创建 API:它是单击按钮时调用的函数。