使用AWS API Gateway和Java处理错误响应状态代码/实体

时间:2016-02-01 20:09:08

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

我是AWS API Gateway的新手,我将其与AWS Lambda(Java)一起使用 显然,更改响应状态代码(到4xx,5xx等)的唯一方法是返回一个必须与资源的Integration Response部分中的Lambda错误正则表达式匹配的String,或者抛出一个也应该包含一个消息匹配正则表达式,是吗?

但是如果我只能返回一个字符串,我该如何为响应实体提供更多细节呢? 以下是我的RESTful API用于返回的相应错误状态代码:

{
    "code": "123",
    "message": "Invalid email address",
    "path": "/email"
}

代码属性对于调试或国际化(i18n)很有用,路径是要纠正的字段 有时我把它包裹在一个"错误" JSON对象,有时我返回一个验证错误列表,而不是只返回1个错误等。我根据项目规范自定义它。

如何使用API​​网关生成此类响应实体?
谢谢。

编辑:感谢kennbrodhagen的建议,这就是我最终做的事情:
1.我将我的错误对象(使用杰克逊ObjectMapper)字符串化 2.我将带有字符串错误的RuntimeException抛出为消息
在整合响应中:
3.我将错误的一些属性用于Lambda错误正则表达式 我映射了这个模板

{ "error": $input.path('$.errorMessage') }

然后API响应(如果发生错误)变为

{ "error": {"code": "123", ... }}

现在非常基本,但不仅仅是在响应中获取字符串。

2 个答案:

答案 0 :(得分:2)

  

显然,更改响应状态代码(到4xx,5xx等)的唯一方法是返回一个必须与资源的Integration Response部分中的Lambda错误正则表达式匹配的String,或者抛出异常应该包含与正则表达式匹配的消息,是吗?

正确。

在目标响应中,您可以配置映射模板,这些模板可以访问Lambda响应的任何其他部分以及上下文变量,这些变量在此处记录:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

因此,您可以在'/ email'

下的400响应中设置映射模板
{
    "code": "123",
    "message": "Invalid email address",
    "path": "$context.resourcePath"
}

或类似的东西。这将是为Lambda错误设置自定义响应正文的唯一方法 - >状态代码映射。

答案 1 :(得分:2)

我知道您正在使用Java,但我对节点更熟悉,因此我更容易以这种方式进行原型设计。希望它能在没有太多麻烦的情况下翻译。

这是我在节点中创建的原型函数。目标是将错误对象作为JSON响应主体返回。 状态属性将用于映射到相应的HTTP状态。

exports.handler = function(event, context) {
    var response = {
        status: 400,
        message: "Error details",
        path: "/x"
    }

    context.fail(JSON.stringify(response));

};

要使用状态属性值映射到HTTP 400,然后在JSON响应中返回整个结构,请执行以下操作:

  1. 在Lambda中将错误传递给context.done或context.fail时,在其上调用JSON.stringify()将其转换为JSON字符串。由于您使用的是Java,我假设您会找到一种不同的方法将错误转换为等效的JSON字符串。

  2. 在API网关集成响应设置中,映射使用与包含JSON格式的状态代码的属性匹配的正则表达式。在下面的示例中,我使用。*" status":400。* 来匹配status属性。请注意,我将代码作为数字发送,因此如果您想使用字符串,则必须在正则表达式中添加引号。另请注意,将。*放在正则表达式的开头和结尾非常重要,这样才能在子字符串上匹配。

  3. 在API网关集成响应设置中,应用程序/ json Content-Type和映射模板如下所示:

    <强> $ input.path(&#39; $的errorMessage&#39)

  4. enter image description here

    Lambda将您传递给完成/失败的内容并在其上调用toString()。然后,它将该字符串指定为它发送到API网关的JSON响应中的errorMessage属性的值。

    接下来,API Gateway将正则表达式应用于errorMessage属性的值。

    最后,API Gateway针对Lambda响应字符串执行映射模板。映射模板从errorMessage中提取值并将其呈现为响应主体。

    要让API网关返回多个不同的状态结果,您需要为每个结果设置单独的Integration Response映射。您可以将相同的模板复制/粘贴到每个模板中。