【问题标题】:AWS API Gateway Proxy Response failure/droppedAWS API Gateway 代理响应失败/丢弃
【发布时间】:2017-03-14 11:33:07
【问题描述】:

问题

AWS API Gateway 代理在使用 Postman 时没有从我的后端服务传回响应,但在 curl 上工作

说明

我有一个想通过 AWS API 网关公开的后端服务。在这种情况下使用网关纯粹是作为 HTTP 代理。所以,

  1. 创建了新的 API
  2. 使用 ANY 将资源设置为“代理”
  3. 给我的后端服务地址
  4. 已部署(无需身份验证,但需要 API 密钥)
  5. 可以从部署阶段 url 成功调用我的后端服务
  6. 使用 CA 证书创建自定义域
  7. 在我的 DNS 提供商上创建了别名
  8. 1 小时后,域启动并指向云端工作

问题

我调用了自定义域,

  1. API 网关收到了
  2. 通话记录在 cloudwatch 日志中,并且
  3. 它正在访问我的后端。
  4. 后端回复 API 网关。

但是,在我的邮递员身上,我看到 “无法得到任何回应”

但是,如果我通过 curl 尝试此操作,我将收到后端发送的预期响应。所以,不清楚的部分是 -

  1. Postman 调用或基于普通浏览器 url 栏的 GET 到我的端点有什么问题?

  2. 为什么 curl 成功了?

  3. 并且,对于我的 API 网关端点,我已将 API 密钥设置为强制。我创建了一个 API 密钥并将其分配给 API。有趣的是,即使我没有传递 API 密钥,curl 调用仍然成功。为什么 API Gateway 会允许这样的调用?

  4. 另一个令我困惑的问题是,我必须在我用于 API 版本控制的 AcceptContent-Type 中传递自定义值。

例如:Accept: application/json-v1 失败,但 Accept: application/xml-v1 工作正常。

我认为这与价值有关,因为 API Gateway 不喜欢它。

我已经彻底阅读了文档,但仍然无法为所有这些问题找到任何合理的解释。我错过了什么导致这些奇怪的问题包?到目前为止,我的 google fu 也不足以解决这个问题。

请帮助或同样指出 AWS 网关中可以帮助解决此问题的特定文档或我可能错过的关于这些主题的任何讨论线程。

至少得到其中一个的答案会让我对我的方法有一个清晰的认识。

谢谢大家!

【问题讨论】:

    标签: api amazon-web-services curl proxy aws-api-gateway


    【解决方案1】:

    我遇到了同样的问题。

    适用于我们用例的解决方案是在应用程序服务器上禁用压缩。然后从 AWS API Gateway 设置中启用Content Encoding 功能:

    不要忘记从 resources 部分重新部署您的 API 阶段!!

    对于在 AWS Lambda 中运行的 Express.js API 端点并通过 API 网关 proxyed,您可以将 app.js 修改为如下所示:

       const compression = require('compression');
       if (!process.env.LAMBDA_TASK_ROOT) {
          app(compression()); // compression is only enabled when not in Lambda
       }
    

    【讨论】:

      【解决方案2】:

      快速回答:添加标题Accept-Encoding:identity

      我在使用 AWS api-gateway 时遇到了完全相同的问题。在我的情况下,解决方案是从邮递员添加标头 Accept-Encoding:identity 或配置 AWS API 以默认将其发送到我的后端。

      当我直接从邮递员调用我的后端时,我可以将标题设置为gzip,邮递员将正确显示响应,但是当我通过 AWS 执行此操作时,这似乎是一个我无法解决的问题.将提到的标头设置为Identity 将指示后端不要修改响应(或应用标识函数)。

      【讨论】:

      • 也为我工作。谢谢!
      • 哇,我已经在这玩了好几个小时了,我想我永远也想不通。谢谢!!!
      • 对我来说,所有其他端点都在没有此标头的情况下工作,只有具有较大有效负载的端点没有响应。将标头添加到请求中使其工作。 API网关是否需要修改任何其他配置,以便在没有标头的情况下工作?
      【解决方案3】:
      1. curl 和 Postman/浏览器最终都会向您的 API 网关发出 HTTP 请求,因此任务是找出请求中的差异。如果您使用 -v 标志运行 curl,您将获得详细的输出,其中将包含随请求发送的所有标头。邮递员/浏览器应该有类似的东西,请比较它们,你应该会发现不同之处。 另外,为了消除自定义域成为可能的问题,您是否尝试过向非自定义域 (*.execute-api) URI 发出请求?

      2. 见 1。

      3. 确保您的代理方法已选中“需要 API 密钥”复选框。
      4. 如果您使用映射模板转换,则必须为您希望从客户端请求中收到的每种内容类型设置一个模板。如果您不使用转换,请确保为集成请求选择了 WHEN_NO_TEMPLATE(“当控制台 UI 中没有定义模板时(推荐)”)传递行为。 见:12

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-05
        • 2018-06-09
        • 1970-01-01
        • 2017-10-04
        • 2018-12-02
        • 2018-03-31
        • 2020-10-25
        • 1970-01-01
        相关资源
        最近更新 更多