我创建了一个简单的APIG API,其中包含一个名为'abc'的资源,并添加了两个方法GET和POST,两者的授权设置都是NONE,API Key Required设置为false,所有内容都部署到了一个名为'dev'的阶段。
当然,我在这两个方法上都启用了CORS,并且我看到了三个头部Access-Control-Allow-Origin、Access-Control-Allow-Headers和Access-Control-Allow-Methods被添加到OPTIONS方法中,Access-Control-Allow-Origin被添加到POST和GET方法中。
这两个调用都映射到同一个lambda函数,该函数只是简单地将'Hello from Lambda'文本输出到控制台。
然后我创建了一个简单的HTML页面,将其作为一个静态网站托管在S3上,使用Route53指向一个域名,并开始使用jQuery $.ajax测试API进行调用。
一切都看起来很简单,直接按照文档中的说明进行操作,只是GET方法可以正常工作,并按预期将文本输出到控制台。而POST方法则会出现以下错误:
请求的资源上没有'Access-Control-Allow-Origin'头部。因此,不允许从'http://example.com'访问。响应的HTTP状态码为400。
预检请求可以正常工作并返回200 OK,所有头部都存在,但是POST请求返回了该错误和400 Bad Request。
非常感谢任何帮助,希望AWS团队也能看到这个问题...
编辑 - 从Google Chrome复制:
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
选项原始响应头:
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