amazon-web-services - 适用于OPTIONS的AWS API Gateway CORS正常,执行POST失败

标签 amazon-web-services cors aws-lambda aws-api-gateway

我已经看过SO上的其他相关问题,但这似乎有所不同。
实际上,我的问题与this one非常相似,除了我没有400状态问题。

设置:

通过API网关的

  • lambda函数
  • 授权:无,需要API key :false
  • 部署到阶段:测试
  • 1个资源,1个POST方法集成了lambda。
  • 直接调用POST端点,例如使用curl总是返回200(有/无有效负载,不良有效负载等)-因此与所引用的问题不同。

  • 我使用了“启用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/

    相关文章:

    python - FastAPI:如何仅为特定端点启用 CORS?

    node.js - CORS 和 HTTPS 重定向的 Access-Control-Allow-Origin 问题(IIS/IISNode/NodeJS)

    javascript - Alexa 内置插槽类型 : No value being passed

    amazon-web-services - 导出 Lambda ARN

    git - GitHub 上的 ParsePlatform 上的 Parse-server 和 Parse-server-example 有什么区别?

    java - 在 Java 代码中访问 AWS Lambda 环境变量

    php - 无法在新服务器上执行 Ajax 查询

    amazon-web-services - 用于在 S3 事件上触发 Lambda 的 Cloudformation 模板

    tomcat - 将 CORS 过滤器应用于 Tomcat 4XX 响应

    java - 从 lambda 表达式中更新 AtomicBoolean