【问题标题】:AWS API Gateway - change to 404 if query returns nothingAWS API Gateway - 如果查询不返回任何内容,则更改为 404
【发布时间】:2019-03-15 21:42:25
【问题描述】:

我有一个包含几个字段的 Dynamodb 表 - my_id 是 PrimaryKey。在 API 网关中,我使用接受参数 {my_id} 的方法设置了响应。

然后我有一个集成请求映射模板,它接受传入的参数并查询表以返回所有匹配的字段。

然后我有一个集成响应映射模板,可以按照我想要的方式清理返回的项目。

这一切都很完美。

我不知道该怎么做的是,如果传入的参数与表中的任何内容都不匹配,我该如何让它从 200 状态变为 404?

据我所知,当传入的参数不匹配任何内容时,它不会导致错误,它只是不返回任何内容。

看来我需要更改集成响应上的映射模板,以首先检查参数是否为空,然后以某种方式告诉它更改响应状态。

我可以从使用 Lambda 的人那里找到有关此类事情的信息,但我没有使用 Lambda - 只是 Dynamodb 表和 API 网关。

【问题讨论】:

  • 您是否为您的 API Gateway GET 方法设置了 404 的方法响应? DynamoDB 响应返回一个错误代码,您应该能够将其映射到集成响应中的 API Gateway 错误代码。 [此处的文档] (docs.aws.amazon.com/amazondynamodb/latest/developerguide/…)
  • 问题是我正在运行一个查询,如果查询没有返回结果就没有错误。如果表格错误,我会收到错误消息,但表格永远不会出错,因为它已被烘焙到映射模板中。当查询没有返回结果时,我想有一个错误。
  • 此处的文档 (docs.aws.amazon.com/amazondynamodb/latest/APIReference/…) 似乎表明您将收到一个包含 "Count": 数字对的大型 JSON 响应——它看起来像您也许可以使用集成响应的主体映射模板来解析 JSON 并检查 Count 元素是否为 0 并将其映射到 404 错误——更多文档在这里:docs.aws.amazon.com/apigateway/latest/developerguide/…
  • 从那个链接你可以得到这个:velocity.apache.org/engine/devel/vtl-reference.html 我认为这是我需要的。检查计数以查看是否为零是我想要做的,只是不清楚语法是什么。
  • 我取得了一些进展——获取 Count: 0 并控制映射模板返回的内容没有问题。但问题是我在 200 响应映射模板中。我读过的所有东西都是基于 Lambda 的,并且让 Lambda 通过错误。我没有使用 Lambda,所以 200 集成响应似乎是第一个检查错误的地方,但似乎我需要先一步。似乎我需要在请求响应中做一些事情,但那是请求,我认为它还不知道它得到了什么。

标签: amazon-dynamodb aws-api-gateway


【解决方案1】:

您可以使用映射模板来转换从 DDB 获得的响应并覆盖响应代码。您可以在链接https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-override-request-response-parameters.html获取更多详细信息

如果你正在使用云形成,你可以使用下面的 sn-p 来做到这一点

IntegrationResponses:
  - StatusCode: "200"
    ResponseTemplates:
        application/json: |
          {
            "payload" : {
              }
            },
          }
IntegrationResponses:
  - StatusCode: "200"
    ResponseTemplates:
       application/json: |
                #set($inputRoot = $input.path('$'))
                #if($inputRoot.toString().contains("Item"))
                $input.json("$")
                #set($context.responseOverride.status = 200)
                #else
                #set($context.responseOverride.status = 404)
                #end

【讨论】:

    【解决方案2】:

    Api网关目前支持使用集成响应的状态码来映射状态码(这里是dynamodb响应码)。唯一的解决方法是使用 lambda 函数,该函数输出可以使用错误正则表达式 http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-method-settings-execution-console.html 映射的不同错误消息。

    【讨论】:

    • 不幸的是,这是真的。也许他们有一天会改变它。
    • 我可以确认 API Gateway 需要响应正文以及状态代码 404,否则(空正文或不适合消息模板的正文)它将匹配默认响应代码,对我来说是 200。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多