我试图从惠普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属性控制。


当前回答

在2021年12月,Chrome 97,授权:持有人…不允许,除非它在Access-Control-Allow-Headers preflight响应中(忽略*)。它发出了这样的警告:

[Deprecation] authorization will not be covered by the wildcard symbol (*)

参见:Chrome企业版发布说明,Chrome 97

它似乎也对Access-Control-Allow-Origin上的*执行了相同的限制。如果您现在想在*类行为被阻止后恢复它,您可能必须读取请求者的原点,并在预飞行响应中返回它作为允许的原点。

在某些情况下,当存在其他无效的凭据(例如:过期的JWT)时,库可能会删除Access-Control-Allow-Origin响应标头。然后,浏览器显示“No 'Access-Control-Allow-Origin'头是存在的”错误,而不是实际的错误(在这个例子中可能是过期的JWT)。请确保您的库不会丢失报头,从而使客户端感到困惑。

其他回答

在我的例子中,我使用下面的解决方案。

前端还是角

post(
    this.serverUrl, dataObjToPost,
    {
      headers: new HttpHeaders({
           'Content-Type':  'application/json',
         })
    }
)

后端(我使用PHP)

header("Access-Control-Allow-Origin: http://localhost:4200");
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header("Access-Control-Allow-Headers: Content-Type, Authorization");

$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
print_r($request);

对于Node.js和Express.js后端,我使用这个:)

App.use(函数(req, res, next) { res.header(“Access-Control-Allow-Origin”、“YOUR-DOMAIN.TLD”);//更新到匹配你将发出请求的域 res.header("Access-Control-Allow-Headers", "Origin, x - request - with, Content-Type, Accept"); next (); });

更多详情:CORS在ExpressJS

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

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

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

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

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

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

CORS问题的可能原因

检查服务器端访问标头:参考此链接 在浏览器中检查从服务器接收到的请求头。下图显示了标题 如果您正在使用fetch方法并试图访问跨源请求,请确保mode:cors存在。请参阅此连结 有时如果程序中有问题,你也会得到CORS问题,所以确保你的代码正常工作。 确保在API中处理OPTION方法。

在。net Core 6.0中使用WebAPI构建

以上这些方法对我都没用……这就成功了

// global cors policy
   app.UseCors(x => x
        .AllowAnyMethod()
        .AllowAnyHeader()
        .SetIsOriginAllowed(origin => true) // allow any origin 
        .AllowCredentials());

来源:https://stackoverflow.com/a/70660054/8767516