【问题标题】:AWS API Gateway: Regex for error is not picked upAWS API Gateway:未选择错误的正则表达式
【发布时间】:2017-11-26 17:26:12
【问题描述】:

我有一个绑定到 AWS API 网关的 Lambda 函数。当我用 /foo/barbar 之类的东西调用它时,我的函数(正确)返回如下内容:

{
  "code": 404,
  "message": "bar not found"
}

我现在希望它的状态码也是 404,但是按照我在网上找到的教程,我到目前为止没有成功。我做了什么:

我为 404 创建了一个方法响应,如下所示:

在集成响应中,我设置了以下内容:

据我了解,当404 出现在响应文档中时,这应该将代码设置为404,但我仍然得到200

我错过了什么?

【问题讨论】:

  • 不,它没有。我什至尝试对输出进行整形,使其看起来与您的完全一样,但我仍然得到 200。似乎它没有选择正则表达式。如果我将正则表达式设置为 .*(全部匹配),它会起作用,但只要我合并任何其他字符,它就会被忽略。

标签: amazon-web-services f# aws-lambda aws-api-gateway


【解决方案1】:

我进行了更多调查,发现 API 网关对错误消息的预期位置非常挑剔,以及我必须如何将它们取出。

the documentation 中,errorMessage 属性被认为与 Lambda 错误正则表达式匹配,并且first answer to this post 声明您必须在使用 Java 8 时抛出异常。我使用.net 用于我的 Lambda 函数,所以我做了这个非常简单的事情:

new Exception("404") |> raise

然后我设置了 Lambda 错误正则表达式 404 并且它起作用了。

接下来我尝试的是:

new Exception("foo 404 bar") |> raise

使用正则表达式 .*404.* 它仍然有效。

现在事情来了:我试图发出一个 JSON 对象作为错误,但我在 C# 或 F# 中找不到任何可以让我这样做的东西,所以我想出了以下内容:

type Error = {
    code: int
    message: string
}

...

new Exception({ code = 404; message = name |> sprintf "%s not found" } |> JsonConvert.SerializeObject) |> raise

然后繁荣,我又得到了 200。

所以我由此得出结论,AWS 不喜欢 errorMessage 属性中的字符串化 JSON,所以我现在只输出一个像这样的简单字符串:

new Exception(name |> sprintf "404: %s not found") |> raise

并使用正则表达式404:.*,它现在可以工作了。这意味着,我必须以某种方式使用 API 网关中的映射构造我想要的输出对象。

这很不方便,而且很容易绊倒......

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2020-10-10
    • 2020-01-03
    • 1970-01-01
    • 2020-03-24
    • 2011-06-18
    • 2015-01-11
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多