AWS API Gateway + AWS Lambda中的CORS

Faw*_*ter 2 javascript amazon-web-services cors aws-lambda aws-api-gateway

我正在尝试使用AWS Lambda和API Gateway设置POST lambda函数.这个POST应该可以使用Javascript从现代浏览器调用,所以很自然地,我需要为此启用CORS.不幸的是,无论我做什么,服务器都会在Firefox中返回400错误.我在Gateway的POST功能上启用了CORS,并设置了一个包含所有必需头的OPTIONS功能,但我仍然得到:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://ua1c36to9i.execute-api.ap-southeast-2.amazonaws.com/beta. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

它告诉我,我没有收到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
Run Code Online (Sandbox Code Playgroud)

标题X-Cache: Error from cloudfront似乎告诉我Lambda必须返回某种内部服务器错误,并且CORS仅在Gateway上启用HTTP 200请求.实际上,我的OPTIONS预检返回HTTP 200 OK,这表明CORS似乎启用得很好.但我不知道如何用lambda捕获错误并为CORS启用它,所以我不知道我的内部错误可能是什么.

但令我感到奇怪的是,如果我使用test-cors.org测试我的POST功能,它声称我得到了一个HTTP 200 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);
    }
});
Run Code Online (Sandbox Code Playgroud)

AWS Lambda上的函数当前配置为忽略POSTed数据并仅返回硬编码字符串,因此AJAX有效负载无关紧要.

agm*_*984 5

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

看看这里:AWS API Gateway - CORS + POST无法正常工作

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

headers: {
     "Access-Control-Allow-Origin": "*"
},
Run Code Online (Sandbox Code Playgroud)

我还建议尝试:

data: JSON.stringify(myData)

这也是一个很好的资源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

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

  • 哇,解决了!我永远不会猜到负载内容类型会是罪魁祸首!编辑:澄清任何未来的搜索者,问题是需要`JSON.stringify()`。 (2认同)