【发布时间】:2016-12-23 13:23:33
【问题描述】:
CORS 真的让我发疯了,我真的不知道如何让它发挥作用。
我创建了一个简单的 APIG Api,其中包含 1 个名为“abc”的资源,并添加了 2 个方法 GET 和 POST 都将 Authorization 设置为NONE 和 API Key Required 设置为 false,所有内容都部署到名为“dev”的阶段。
当然,我在这两种方法上都启用了 CORS,我看到了 3 个标题 Access-Control-Allow-Origin、Access-Control-Allow-Headers 和 Access-Control-Allow-Methods 添加到 OPTIONS 方法中,Access-Control-Allow-Origin 添加到 em>POST 和 GET 方法。
两个调用都映射到相同的 lambda 函数,该函数只是将“Hello from Lambda”文本输出到控制台。
然后我创建了一个简单的 html 页面,我在 S3 上作为 静态网站 托管,使用 Route53 将域指向它并开始使用 jQuery $.ajax 测试 API 以进行调用。
一切看起来都简单、直接并且完全按照文档中的说明进行,除了只有 GET 可以正常工作并将文本按预期输出到控制台。 POST 版本导致以下错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access. The response had HTTP status code 400.
预检调用正常并返回 200 OK 并且所有标头都在那里,但 POST 调用返回该错误和 400 Bad Request。
非常感谢任何帮助,我希望 AWS 团队也在关注...
谢谢各位。
已编辑 - 从谷歌浏览器复制:
POST 原始请求标头:
POST /dev/urls HTTP/1.1
Host: kykul1mshe.execute-api.us-east-1.amazonaws.com
Connection: keep-alive
Content-Length: 73
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Content-Type: application/json
Referer: http://example.com/dev.html
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
POST 原始响应标头:
HTTP/1.1 400 Bad Request
Date: Fri, 19 Aug 2016 02:14:16 GMT
Content-Type: application/json
Content-Length: 177
Connection: keep-alive
x-amzn-RequestId: a1160e45-65b2-11e6-9766-cd61e49fbcdb
X-Cache: Error from cloudfront
Via: 1.1 d64756b4df47ce24d6c62b5a8de97e87.cloudfront.net (CloudFront)
X-Amz-Cf-Id: N9mf7apicKbSM_MiZjePbEgZGIFKckWJ3lZljH8iHVKFVTcIIOQuHg==
这会返回 400 错误请求
OPTIONS 原始请求标头:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:kykul1mshe.execute-api.us-east-1.amazonaws.com
Origin:http://example.com
Referer:http://example.com/dev.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
OPTIONS 原始响应标头:
Access-Control-Allow-Headers:Content-Type,X-Amz-Date,Authorization,X-Api-Key,Cache-Control,X-Requested-With
Access-Control-Allow-Methods:POST,OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:79
Content-Type:application/json
Date:Fri, 19 Aug 2016 02:14:16 GMT
Via:1.1 d64756b4df47ce24d6c62b5a8de97e87.cloudfront.net (CloudFront)
X-Amz-Cf-Id:KpGEDmIuf5RHcUnBWuA3oEMZgWHwrjy3SpLuOflRhAD8IIx5vyKGSw==
x-amzn-RequestId:a10bae11-65b2-11e6-bcf7-63b49c24629e
X-Cache:Miss from cloudfront
这会返回 200 OK
【问题讨论】:
-
嗨,我来自 api 网关。我认为您设置 api 的方式没有任何问题。你能更新原始请求吗?这将有助于调试。
-
感谢您回复@AbhignaNagaraja - 我用谷歌浏览器中的标题更新了帖子(我刚刚隐藏了真实域名)。
标签: api amazon-web-services cors aws-api-gateway