我已经看过关于SO的其他相关问题,但这似乎有所不同。 事实上,我的问题与this one非常相似,除了我没有400状态问题。
设置:
部署到阶段:test
1个资源,1个集成lambda的POST方法。
我已经使用了"启用CORS"选项 - 我已尝试在资源和POST请求(以及之后部署API)上应用此选项。
在API GW中,我可以在POST方法 - 方法响应区域下的200个响应标题中看到Access-Control-Allow-Origin
。
结果:在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>
回复是:
< 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-
任何标题。
我还能检查什么?
答案 0 :(得分:18)
问题是API网关使用选中的"Lambda Proxy Integration"
选项调用了我的lambda函数。
我相信在向新创建的lambda函数添加API网关触发器时默认激活它。
当进入API网关 - 资源 - 方法视图时,&#34;集成响应&#34;框是灰色的,似乎没有办法(即使是启用CORS功能)在那里添加Access-Control-Allow-Origin
标题,根据@Abhigna_Nagaraja是必需的。
解决方案:
如果使用&#34; Lambda代理集成&#34;,请将'Access-Control-Allow-Origin': '*'
标头添加到lambda函数中。
更好:在同一视图中 - 集成请求,关闭&#34; Lambda代理集成&#34;并再次启用CORS(之后部署)。
(然后,在回调中,您必须只返回有效负载json而不是{ statusCode, headers, body }
对象。)
<强>更新强>:
如果您不确定是否在http状态代码或json有效负载中返回请求响应状态信息,请执行一些有用的读取:
答案 1 :(得分:2)
&#39;启用CORS&#39; option是一个方便的工具,可以设置所有集成/方法响应头映射。如果您点击了“启用CORS&#39;然后添加了一个新资源,它不具备所需的设置。您可以点击“启用CORS&#39;再次或您可以手动将其设置为
另外,在使用curl测试更改之前,不要忘记部署API。
答案 2 :(得分:0)
如果您愿意使用 serverless-express 在 Lambda 中包装一个简单的 Express 应用程序,Express cors
package 可以让 Lambda 代理非常简单且高度可配置。无需在 API 网关级别配置 CORS。
index.js
const app = express();
app.use(cors());
// ...your backend implementation
lambda.js
const serverlessExpress = require('@vendia/serverless-express')
const app = require('./app')
exports.handler = serverlessExpress({ app })