我已经看过SO上的其他相关问题,但这似乎有所不同。
实际上,我的问题与this one非常相似,除了我没有400状态问题。
设置:
通过API网关的
我使用了“启用CORS”选项-我尝试在资源和POST请求上都应用此选项(然后再部署API)。
在API GW中,我可以在POST方法-方法响应区域下的200个响应标题中看到
Access-Control-Allow-Origin
。结果:从Chrome中的客户端代码调用端点,OPTIONS通过了,但由于缺少
Access-Control-Allow-Origin
header 而导致POST失败。curl :OPTIONS调用
curl -X OPTIONS -H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: Content-Type" \
-H "Origin: http://example.com" --verbose <endpoint>
响应是:
< HTTP/1.1 200 OK
< Content-Type: application/json
...
< Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
< Access-Control-Allow-Methods: POST,OPTIONS
< Access-Control-Allow-Origin: *
...
但使用POST:
curl -X POST -d '{}' -H "Content-Type: application/json" \
-H "Origin: http://example.com" --verbose <endpoint>
它返回:
< HTTP/1.1 200 OK
< Content-Type: application/json
...
和响应json主体-但没有
Access-
任何 header 。我还能检查什么?
最佳答案
问题在于API网关已使用选中的"Lambda Proxy Integration"
选项调用了我的lambda函数。
我相信在将API网关触发器添加到新创建的lambda函数时,默认情况下会激活此功能。
在“API网关-资源-方法” View 中,“集成响应”框显示为灰色,似乎没有办法(即使是Enable CORS功能)也无法在其中添加Access-Control-Allow-Origin
header ,根据@Abhigna_Nagaraja的要求,该 header 是必需的。
解决方案:
如果使用“Lambda代理集成”,则将'Access-Control-Allow-Origin': '*'
header 添加到您的lambda函数中。
更好的是:在同一 View -集成请求中,关闭“Lambda代理集成”,然后再次启用CORS(随后进行部署)。
(然后,在回调中,您只需要返回有效负载json而不是{ statusCode, headers, body }
对象。)
更新:
如果您不确定是返回HTTP状态代码还是json负载中的请求响应状态信息,则可以进行一些有用的阅读:
http status vs json status
json status standards
关于amazon-web-services - 适用于OPTIONS的AWS API Gateway CORS正常,执行POST失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40149788/