我是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网关生成此类响应实体?
谢谢。
ObjectMapper
)字符串化
2.我将带有字符串错误的RuntimeException
抛出为消息{ "error": $input.path('$.errorMessage') }
然后API响应(如果发生错误)变为
{ "error": {"code": "123", ... }}
现在非常基本,但不仅仅是在响应中获取字符串。
答案 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响应中返回整个结构,请执行以下操作:
在Lambda中将错误传递给context.done或context.fail时,在其上调用JSON.stringify()将其转换为JSON字符串。由于您使用的是Java,我假设您会找到一种不同的方法将错误转换为等效的JSON字符串。
在API网关集成响应设置中,映射使用与包含JSON格式的状态代码的属性匹配的正则表达式。在下面的示例中,我使用。*" status":400。* 来匹配status属性。请注意,我将代码作为数字发送,因此如果您想使用字符串,则必须在正则表达式中添加引号。另请注意,将。*放在正则表达式的开头和结尾非常重要,这样才能在子字符串上匹配。
在API网关集成响应设置中,应用程序/ json Content-Type和映射模板如下所示:
<强> $ input.path(&#39; $的errorMessage&#39)强>
Lambda将您传递给完成/失败的内容并在其上调用toString()。然后,它将该字符串指定为它发送到API网关的JSON响应中的errorMessage属性的值。
接下来,API Gateway将正则表达式应用于errorMessage属性的值。
最后,API Gateway针对Lambda响应字符串执行映射模板。映射模板从errorMessage中提取值并将其呈现为响应主体。
要让API网关返回多个不同的状态结果,您需要为每个结果设置单独的Integration Response映射。您可以将相同的模板复制/粘贴到每个模板中。