Javascript AWS API网关中的CORS+;AWS Lambda

Javascript AWS API网关中的CORS+;AWS Lambda,javascript,amazon-web-services,cors,aws-lambda,aws-api-gateway,Javascript,Amazon Web Services,Cors,Aws Lambda,Aws Api Gateway,我正在尝试使用AWS lambda和API网关设置一个POST lambda函数。这篇文章应该可以在使用Javascript的现代浏览器中调用,所以很自然,我需要为此启用CORS。不幸的是,无论我做什么,服务器在Firefox中返回400错误。我在Gateway中的POST功能上启用了CORS,并设置了一个包含所有必要标题的选项功能,但我仍然得到以下信息: 跨源请求被阻止:同一源策略不允许读取远程资源https://ua1c36to9i.execute-api.ap-southeast-2.am

我正在尝试使用AWS lambda和API网关设置一个POST lambda函数。这篇文章应该可以在使用Javascript的现代浏览器中调用,所以很自然,我需要为此启用CORS。不幸的是,无论我做什么,服务器在Firefox中返回400错误。我在Gateway中的POST功能上启用了CORS,并设置了一个包含所有必要标题的选项功能,但我仍然得到以下信息:

跨源请求被阻止:同一源策略不允许读取远程资源https://ua1c36to9i.execute-api.ap-southeast-2.amazonaws.com/beta. (原因:缺少CORS标题“访问控制允许原点”。

它告诉我我没有收到
Access Control Allow Origin
标题,我可以通过查看网络选项卡中的响应来确认:

Content-Length: 181
Content-Type: application/json
Date: Sun, 23 Apr 2017 03:39:10 GMT
Via: 1.1 d0d3075c33572544a6859ec75d2258a1.cloudfront.net (CloudFront)
X-Amz-Cf-Id: EEMUjL78Bf1PSwt4E4QGPgTLXSD8sehiUCgy-XA7TC_1cKv3jxs9Rg==
X-Cache: Error from cloudfront
X-Firefox-Spdy: h2
x-amzn-RequestId: 6943b9bd-27d6-11e7-aaae-f36ce836982f
标题
X-Cache:Error from cloudfront
似乎告诉我Lambda必须返回某种内部服务器错误,并且CORS仅在网关上为HTTP 200请求启用。事实上,我的选项飞行前会返回HTTP200OK,这表明CORS似乎可以正常启用。但是我不知道如何用lambda捕获错误并为CORS启用它,所以我不知道我的内部错误可能是什么

但让我感到好奇的是,如果我使用test-cors.org来测试我的POST函数,它声称我得到了一个HTTP200 OK。更奇怪的是,如果我复制它生成的确切代码来发出请求,并将其放入本地机器上的测试HTML页面中,我仍然可以得到HTTP 400。发生什么事了

我的ajax调用:

var myData = JSON.parse(this.result);
console.log(result);
$.ajax({
    type: "POST",
    dataType: "json",
    url: "https://ua1c36to9i.execute-api.ap-southeast-2.amazonaws.com/beta",
    data: myData,
    headers: {
        "Content-Type":"application/json"
    },
    success: function (data) {
        console.log(data);
    },
    error: function (error) {
        console.log(error);
    }
});

AWS Lambda上的函数当前配置为忽略发布的数据,只返回硬编码字符串,因此AJAX负载应该无关紧要。

您可以尝试下载AWS APIG SDK并使用apigClient执行AJAX调用,然后将头与脚本中的头进行比较

请看这里:

根据您的代码,手动设置标头特别有趣:

headers: {
     "Access-Control-Allow-Origin": "*"
},
我还建议尝试:

data:JSON.stringify(myData)

这也是一个很好的资源:


我们的API服务器与AWS Beanstalk上的CORS有一些问题,对我们来说,这归结为正确设置它们。我记得在最初设置缓存时,我也曾多次要求清除缓存。

哇,问题解决了!我从来没有想到负载内容类型会是罪魁祸首!编辑:澄清一下,对于未来的搜索者来说,问题是需要
JSON.stringify()
。很好,我在我链接的线程中读到一些提到的内容后,我有一种感觉,我看到您的数据正在进行原始处理,导致
400个错误请求
。回过头来看,如果缺少标题,您可能会看到一些错误
413禁止
响应。祝您愉快:)