我陷入了API网关问题,并且在AWS论坛上浏览了所有其他SO解答,并通过了他们的文档,但仍然不满意。
我正在尝试使用AWS API网关设置API,该API调用Lambda函数,该函数读取/写入DynamoDB中的表。
DynamoDB的Lambda函数正在运行。我已经在AWS中创建了一个API,并为其创建了GET和OPTIONS方法。我读到AWS并没有仅对GET / POST强制执行OPTIONS,但是当没有OPTIONS方法时,我在ajax调用中遇到了预检错误,因此我添加了一个。
现在只是为了取得进展,我还没有使用API密钥或授权。我可以使用POSTMAN成功调用我的GET方法,该方法返回DynamoDB表的内容。
但是当我尝试使用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调用,因此origin为null,因为该页面将作为JS中的单个网页应用程序部署到S3。
当我在GET和OPTIONS上启用CORS时,我可以看到Access-Control-Allow-Headers为,'Content- Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'而Access-Control- Allow-Origin *为'*'
'Content- Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'
'*'
我的Ajax呼叫如下所示。我还尝试复制POSTMAN使用的确切标头,该标头设置了Authorization标头(我已经在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函数的响应中设置’Access- Control-Allow- Origin’:’*’标头。我在AWS文档中寻找了此内容,但找不到它。此链接描述了Lambda和Lambda代理之间的区别,并说明了使用CORS https://serverless.com/framework/docs/providers/aws/events/apigateway/时的操作
对Lambda函数的GET请求响应也必须包含Access-Control-Allow-Origin标头。
Access-Control-Allow-Origin