虽然已经通过API网关设置了CORS并且设置了Access-Control-Allow-Origin标头,但在尝试从Chrome中的AJAX调用API时仍然会收到以下错误:
XMLHttpRequest无法加载http://XXXXX.execute-api.us-west-2.amazonaws.com/beta/YYYYY.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许原点'null'访问.响应具有HTTP状态代码403.
我试图通过Postman获取URL ,它显示上面的标题已成功通过:
并从OPTIONS响应:
如何在不恢复JSON-P的情况下从浏览器调用我的API?
CORS真的让我发疯,我真的没有想法让它变得有用.
我创建了一个简单的APIG Api,其中包含1个名为'abc'的资源,并添加了2个方法GET和POST,其中Authorization设置为NONE,API Key Required设置为false,所有内容都部署到名为'dev'的阶段.
当然,我在两种方法上都启用了CORS,我看到在OPTIONS方法和Access-Control-Allow-中添加了3个标题Access-Control-Allow-Origin,Access-Control-Allow-Headers和Access-Control-Allow-Methods Origin添加到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 …
我看过有关此问题的帖子,但没有任何问题或答案与我的问题足够接近,无法提供有效的答案。
我无法通过浏览器向 API 发送请求。
据我了解,问题在于,当您向 API 网关发送请求时;浏览器将首先发送预检选项请求。此预检请求不会添加任何自定义标头,即:x-apigw-api-idheader. 这会导致返回 403,甚至没有命中选项请求。
我的理解是客户端无法控制预检请求,它由浏览器处理。
获取请求通过邮递员工作,选项请求也是如此,但前提是我x-apigw-api-id为每个请求添加标头。
通过邮递员返回的标头并x-apigw-api-id添加到请求
{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET,OPTIONS","Access-Control-Allow-Headers":"Content-Type,X-Api-Key,","Content-Type":"application/json"}
我删除标题,得到一个403 forbidden.
这个问题有解决方法吗?发送选项请求时也许不需要 x-apigw-api-id ?
我在发帖之前查过的一些问题: