AWS API网关代理响应失败/已丢弃

AWS API网关代理响应失败/已丢弃,api,amazon-web-services,curl,proxy,aws-api-gateway,Api,Amazon Web Services,Curl,Proxy,Aws Api Gateway,问题: 当使用Postman时,AWS API网关代理不会从我的后端服务传回响应,而是在curl上工作 说明: 我想通过AWS API网关公开一个后端服务。在本例中,网关的使用纯粹是作为HTTP代理。所以 创建了一个新的API 使用任何 提供了我的后端服务地址 部署它(不需要身份验证,但需要API密钥) 无法从部署阶段url成功调用我的后端服务 使用CA证书创建自定义域 在我的DNS提供商上创建了一个别名 1小时后,域启动并指向cloudfront工作 问题 我打电话到自定义域 API网关收到了

问题

当使用Postman时,AWS API网关代理不会从我的后端服务传回响应,而是在curl上工作

说明

我想通过AWS API网关公开一个后端服务。在本例中,网关的使用纯粹是作为HTTP代理。所以

  • 创建了一个新的API
  • 使用任何
  • 提供了我的后端服务地址
  • 部署它(不需要身份验证,但需要API密钥)
  • 无法从部署阶段url成功调用我的后端服务
  • 使用CA证书创建自定义域
  • 在我的DNS提供商上创建了一个别名
  • 1小时后,域启动并指向cloudfront工作
  • 问题

    我打电话到自定义域

  • API网关收到了它
  • 呼叫记录在cloudwatch日志中,并且
  • 它击中了我的后端
  • 后端回复到API网关 但是,在我的邮递员身上,我看到一个“无法得到任何回应”

    但是,如果我通过
    curl
    尝试此操作,我会得到后端发送的预期响应。因此,不清楚的部分是—

  • 邮递员呼叫或基于“到达我的端点”的普通浏览器url栏有什么问题

  • 为什么curl会成功

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

  • 另一个让我困惑的问题是,我必须在用于API版本控制的
    Accept
    Content-Type
    中传递自定义值

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

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

    我已经彻底阅读了这些文件,仍然找不到对所有这些问题的任何合理解释。我错过了什么导致了这些奇怪的问题?到目前为止,我的谷歌fu还不足以解决这个问题

    请帮助或同等地向我指出AWS网关中的特定文档,这些文档可以帮助解决我在这些主题上错过的这个或任何讨论线程

    至少对其中一个问题有一个答案会让我对自己的方法有一个清晰的认识

    谢谢大家

  • curl和Postman/browser最终都会向您的API网关发出HTTP请求,因此任务是找出请求之间的区别。如果使用
    -v
    标志运行curl,您将获得详细的输出,其中将包括随请求发送的所有头。邮递员/浏览器应该有类似的东西,请比较它们,你应该会发现不同。 另外,为了消除自定义域可能出现的问题,您是否尝试过向非自定义域(*.execute api)URI发出请求

  • 见1

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

  • 快速回答:添加标题
    接受编码:identity

    我在使用AWSAPI网关时遇到了完全相同的问题。在我的例子中,解决方案是从postman添加header
    Accept Encoding:identity
    ,或者配置AWS API将其默认发送到我的后端


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

    我也遇到了同样的问题

    对我们的用例有效的解决方案是在应用服务器上禁用压缩。然后从AWS API网关设置中启用内容编码功能:

    不要忘记从
    参考资料部分重新部署API阶段

    对于在AWS Lambda中运行的Express.js API端点和通过API网关编辑的
    proxy
    ed,您可以修改
    app.js
    如下所示:

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

    也为我工作。谢谢哇,我已经做了好几个小时了,我想我永远都不会明白这一点。谢谢对我来说,所有其他端点都在没有这个头的情况下工作,只有负载更大的端点没有响应。将头添加到请求使其工作。是否有任何其他配置需要为API网关进行修改,以使其在没有标头的情况下工作?