适用于OPTIONS的AWS API Gateway CORS,POST失败

beb*_*bbi 7 amazon-web-services cors aws-lambda aws-api-gateway

我已经查看过关于SO的其他相关问题,但这似乎有所不同.事实上,我的问题与问题非常相似,只是我没有400状态问题.

设置:

  • lambda函数通过API网关
  • 授权:无,API KEY必需:false
  • 部署到阶段:测试

  • 1个资源,1个集成lambda的POST方法.

  • 直接调用POST端点例如使用curl总是返回200(有/无负载,有效负载等) - 这与引用的问题不同.

我已经使用了"启用CORS"选项 - 我尝试在资源和POST请求(以及之后部署API)上应用此选项.

在API GW中,我可以看到Access-Control-Allow-Origin在POST方法 - 方法响应区域下的200个响应标题中列出.

结果:从Chrome中的客户端代码调用端点,OPTIONS通过但由于缺少Access-Control-Allow-Origin标头POST失败.

在卷曲:OPTIONS调用

curl -X OPTIONS -H "Access-Control-Request-Method: POST" \
     -H "Access-Control-Request-Headers: Content-Type" \
     -H "Origin: http://example.com" --verbose <endpoint>
Run Code Online (Sandbox Code Playgroud)

回应是:

< 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: *
...
Run Code Online (Sandbox Code Playgroud)

但是使用POST:

curl -X POST -d '{}' -H "Content-Type: application/json" \
     -H "Origin: http://example.com" --verbose <endpoint>
Run Code Online (Sandbox Code Playgroud)

它返回:

< HTTP/1.1 200 OK
< Content-Type: application/json
...
Run Code Online (Sandbox Code Playgroud)

和响应json体 - 但没有Access-任何标题.

我还能检查什么?

beb*_*bbi 18

问题是API网关使用"Lambda Proxy Integration"选中的选项调用了我的lambda函数.

我相信在向新创建的lambda函数添加API网关触发器时,默认情况下会激活此功能.

在API网关 - 资源 - 方法视图中,"集成响应"框显示为灰色,似乎没有办法(即使对于启用CORS功能)在Access-Control-Allow-Origin那里添加标题,根据@Abhigna_Nagaraja是必需的.

解决方案:如果使用"Lambda代理集成",请将'Access-Control-Allow-Origin': '*'标头添加到lambda函数中.

更好的是:在同一视图中 - 集成请求,关闭"Lambda代理集成"并再次启用CORS(之后部署).

(然后,在回调中,您将只返回有效负载json而不是{ statusCode, headers, body }对象.)

更新:

如果您不确定是否在http状态代码或json有效负载中返回请求响应状态信息,则会进行一些有用的读取:

http状态vs json状态

json状态标准

  • 我相信新的“ Lambda代理集成”已损坏,因为它仅创建了新的ANY方法。它似乎无法与CORS完美集成,甚至与默认的Lambda触发器向导也不完美集成。目前,我仅通过禁用“ Lambda代理集成”并手动创建GET / POST方法来解决此问题。 (2认同)