当前位置: 首页 > 知识库问答 >
问题:

AWS API Gateway不存在“访问控制允许源”标头

锺离德庸
2023-03-14

我陷入了API网关的问题,我已经浏览了AWS论坛上的所有其他SO答案,并浏览了他们的文档,但仍然没有乐趣。

我正在尝试使用AWS API gateway设置一个API,该API调用一个Lambda函数,该函数读取/写入DynamoDB中的一个表。

DynamoDB的Lambda函数正在工作。我在AWS中创建了一个API,并为它创建了GET和OPTIONS方法。我了解到AWS并不强制只使用GET/POST选项,但是我在ajax调用中遇到了一个预检错误,因为没有OPTIONS方法,所以我添加了一个。

现在只是为了取得进展,我没有使用API密钥或授权。我可以使用 POSTMAN 成功调用我的 GET 方法,该方法将返回迪纳摩DB 表的内容。

但是当我尝试使用JQuery ajax调用时,我得到了

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

我可以看到在网络选项卡下使用Chrome开发工具,OPTIONS方法返回状态200,GET返回状态200,但有上述错误。

我尝试过在 OPTIONS 和 GET 方法上启用 CORS,在每次更改后重新部署 API,尝试了以下操作(http://enable-cors.org/server_awsapigateway.html),但始终在控制台中收到相同的错误。

我正在从我桌面上的文件执行ajax调用,因此源为空,因为该页面将作为JS中的单个网页应用程序部署到S3。

当我在GET和OPTIONS上启用CORS时,我可以看到访问控制允许标头是“Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token”和访问控制允许源*是*“

我的Ajax调用如下所示。我还尝试复制了邮递员使用的确切标题,它设置了授权标题(我现在已经在AWS中关闭了),但我总是得到上面相同的错误

var awsHeaders = {};
awsHeaders['X-Amz-Date'] = '20161127T171734';

$('#add, #cloud').click(function() {

    $.ajax({

        type: 'GET',
        headers: awsHeaders,
        dataType : "json",
        url: '...',
        success: function (res) {

            console.log('response in GET:');
            console.log(res);

        },
        error: function(data) {
            console.log('in error');
            console.log(data);
        }

    });

});

有人能告诉我我可能错过了什么吗?

非常感谢

更新 请参阅下面有关我如何根据DigitalKapteain评论解决此问题的答案 - 通过在我的Lambda函数的响应中设置“访问控制 - 允许 - 来源”:'*“标头。我在 AWS 文档中查找了此内容,但找不到它。此链接描述了 Lambda 和 Lambda 代理之间的区别,并说明了使用 CORS 时应执行的操作 https://serverless.com/framework/docs/providers/aws/events/apigateway/

共有3个答案

慕容恩
2023-03-14

如果这仍然不适合您,请确保使用JSON。如果您使用的是$.ajax,则stringify()您的json对象。如果不是,您仍然会返回一个声称是CORS相关错误的错误。但是,如果使用Postman发送相同的json对象,请求将成功。试试看。。。

巩才捷
2023-03-14

Digitalkapitaen的回答是正确的;下面的代码可以省去一些人查找如何在Lambda中设置HTTP响应头的麻烦:

exports.handler = function(event, context, callback) {
    callback(null, {
        "statusCode": 200,
        "headers": { 
            "Access-Control-Allow-Origin": "*" 
        }
    });
};
秦奇
2023-03-14

对 Lambda 函数的 GET 请求的响应还必须包含访问控制允许源标头。

 类似资料:
  • 我正在开发一个带有jhipster V4.5.6的Spring启动应用程序。但无法配置 CORS。 下面是我的application-dev.yml文件: WebConfigurer.java如下: 和安全配置。java文件如下所示: 现在,我可以使用 GET 请求。但是当我使用POST时,如下所示: 我得到以下错误: XMLHttpRequest 无法加载 http://localhost:80

  • 问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您

  • 我错过了一些东西。我正在努力让API调用工作。然后我像下面一样分割网址,它可以工作——字面上一次。在那之后,它无法再次工作。我发誓我没有改变什么。 在AXIOS中,您是如何操作的? 错误消息是: 无法加载XMLHttpRequesthttp://magicseaweed.com/api/W2Z26fXscpELi7nPB0svfqcGj9FtGO9e/forecast/?spot_id=228.

  • 如何解决以下错误; 加载资源失败:服务器响应状态为500(内部服务器错误)cdn。安普项目。org/v0。js:68响应必须包含AMP访问控制允许源代码源标题Yd@cdn。安普项目。org/v0。js:68 cdn。安普项目。org/v0。js:68表单提交失败:错误:响应必须包含AMP Access Control Allow Source Origin标头​​​ 报道 遵循CORS上AMP G

  • 相对来说,我对Ajax还比较陌生,只是负责这个跨域调用。我们的网页上有一个文本框,用户将使用它来执行公司名称的搜索。通过单击文本框旁边的按钮,将请求Ajax调用。不幸的是,web服务位于一个单独的域中,所以这自然会引起问题。 以下是我为完成这项工作所做的最大努力。我还应该注意,这个调用的目的是以XML格式返回结果,这些结果将在请求的< code>success部分进行解析。 这是再次出现错误消息: