我试图从惠普Alm的REST API中获取一些数据。它使用一个小的curl脚本工作得很好——我得到了我的数据。

现在用JavaScript、fetch和ES6(或多或少)来实现这一点似乎是一个更大的问题。我一直收到这个错误信息:

无法加载获取API。对飞行前请求的响应则不然 pass访问控制检查:没有' access - control - allow - origin '头 显示在所请求的资源上。“http://127.0.0.1:3000”是 因此不允许访问。响应的HTTP状态代码为501。 如果不透明响应满足您的需求,请将请求的模式设置为 'no-cors'获取禁用CORS的资源。

我明白这是因为我试图从我的本地主机内获取数据,解决方案应该使用跨起源资源共享(CORS)。我认为我确实这样做了,但不知为何,它要么忽略了我在头文件中写的内容,要么是其他问题。

那么,是否存在执行问题?我做错了吗?很遗憾,我无法查看服务器日志。我真的有点卡在这里了。

function performSignIn() {

  let headers = new Headers();

  headers.append('Content-Type', 'application/json');
  headers.append('Accept', 'application/json');

  headers.append('Access-Control-Allow-Origin', 'http://localhost:3000');
  headers.append('Access-Control-Allow-Credentials', 'true');

  headers.append('GET', 'POST', 'OPTIONS');

  headers.append('Authorization', 'Basic ' + base64.encode(username + ":" + password));

  fetch(sign_in, {
      //mode: 'no-cors',
      credentials: 'include',
      method: 'POST',
      headers: headers
    })
    .then(response => response.json())
    .then(json => console.log(json))
    .catch(error => console.log('Authorization failed : ' + error.message));
}

我正在使用Chrome浏览器。我也尝试使用Chrome CORS插件,但随后我得到另一个错误消息:

响应中的'Access-Control-Allow-Origin'报头的值 当请求的凭据模式为时,一定不能是通配符'*' “包括”。因此,来源“http://127.0.0.1:3000”是不允许的 访问。对象发起的请求的凭据模式 XMLHttpRequest由withCredentials属性控制。


当前回答

在我的react/express应用程序中遇到了这个问题。在server.js(或你的服务器文件名)中添加以下代码为我解决了这个问题。安装cors然后

const cors = require('cors');
app.use(cors({
    origin: 'http://example.com', // use your actual domain name (or localhost), using * is not recommended
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'],
    allowedHeaders: ['Content-Type', 'Origin', 'X-Requested-With', 'Accept', 'x-client-key', 'x-client-token', 'x-client-secret', 'Authorization'],
    credentials: true
}))

现在,您可以从前端直接调用API,而无需传递任何额外参数。

其他回答

这只是我的个人意见……关于如何使用CORS代理来绕过“无访问控制-允许起源标头”问题

对于那些在后端使用php的人来说,部署“CORS代理”非常简单:

创建一个名为'no-cors.php'的文件,内容如下: $URL = $_GET[' URL ']; file_get_contents ($ URL)回波json_encode (); die (); 在前端,执行如下操作: fetch('https://example.com/no-cors.php' + '?Url =' + Url) 不要犹豫(反应= >{* /处理响应/ *})”

如果您在部署React应用程序netlify时遇到此错误,请使用以下步骤。

步骤1:创建netlify。Toml文件在你的react应用程序的根文件夹。

步骤2:复制粘贴以下代码:

`[[redirects]]
    from = "/cors-proxy/*"
    to = ":splat"
    status = 200
    force = true`

步骤3:以这种方式更新fetch/axios API:

我花了一段时间才想明白。

对我来说,解决办法简直太蠢了……允许的原点不应该有斜杠。

例如:https://example.com/ -> https://example.com

在我的例子中,我必须在所有现有中间件下面添加一个自定义头中间件。我认为一些中间件可能会与Access-Control-Allow-Origin头相冲突,并尝试根据他们的需要来设置它。

所以代码应该是这样的:

app.use(cors());

....all other middleware here

app.use(function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "http://localhost:3000");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
...your routes

在过去的几年里,我遇到过几次这样的错误——似乎是在一个以前正常运行的网站上突然出现的。

我确定Chrome(可能还有其他浏览器)可以在服务器上发生一些不相关的错误时返回此错误,阻止它处理CORS请求(并且在返回HTTP 500错误之前)。

这些都发生在。net Core环境中,我不确定它是否会发生在其他环境中。

无论如何,如果您的代码以前运行过,并且看起来是正确的,那么在您疯狂地试图解决实际上并不存在的错误之前,请考虑调试以发现是否有其他错误正在触发。