使用 AWS API 网关和 Java 处理错误响应状态 code/entity
Handling error response status code/entity with AWS API Gateway and Java
我是 AWS API 网关的新手,我将它与 AWS Lambda (Java) 一起使用。
显然,更改响应状态代码(更改为 4xx、5xx 等)的唯一方法是 return 一个必须与资源的集成响应部分中的 Lambda 错误正则表达式匹配的字符串,或者抛出一个异常还应该包含与正则表达式匹配的消息,对吗?
但是如果我只能 return 一个字符串,我该如何为响应实体提供更多详细信息?
这是我的 RESTful API 用于 return 的内容以及适当的错误状态代码:
{
"code": "123",
"message": "Invalid email address",
"path": "/email"
}
代码属性用于调试或国际化(i18n),路径是要更正的字段。
有时我将它包装在一个 "error" JSON 对象中,有时我 return 一个验证错误列表而不是只有 1 个错误,等等。我根据项目规范自定义它。
如何使用 API 网关生成这样的响应实体?
谢谢。
编辑:感谢 kennbrodhagen 的建议,这是我最终做的事情:
1. 我将错误对象字符串化(使用 Jackson ObjectMapper
)
2. 我抛出一个 RuntimeException
并将字符串化错误作为消息
在集成响应中:
3. 我对 Lambda 错误正则表达式
使用我的一些错误 属性
4.我映射了这个模板
{ "error": $input.path('$.errorMessage') }
然后 API 响应(如果发生错误)变为
{ "error": {"code": "123", ... }}
目前非常基础,但比仅在响应中获取字符串要好。
Apparently the only way to change the response status code (to 4xx, 5xx, etc.) is to return a String that must match the Lambda error regex in the Integration Response section of the resource, or to throw an exception which also should contain a message matching the regex, is that right?
正确。
在目标响应中,您可以配置映射模板,该模板可以访问 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 错误 -> 状态代码映射设置自定义响应主体的唯一方法。
我知道您正在使用 Java,但我对节点更熟悉,所以我更容易以这种方式制作原型。希望它能顺利完成翻译。
这是我在 node.js 中创建的原型函数。目标是 return err 对象作为错误中的 JSON 响应主体。 status 属性 将用于映射到相应的 HTTP 状态。
exports.handler = function(event, context) {
var response = {
status: 400,
message: "Error details",
path: "/x"
}
context.fail(JSON.stringify(response));
};
要使用 status 属性 值映射到 HTTP 400,然后 return 整个结构作为您的 JSON 响应以下:
在 Lambda 中,当您将错误传递给 context.done 或 context.fail 时调用 JSON.stringify() 将其转换为 JSON细绳。由于您使用的是 Java 我假设您会找到一种不同的方法将错误转换为 JSON 等效字符串。
在 API 网关集成响应中设置映射以使用正则表达式匹配包含 JSON 格式的状态代码的 属性 .在下面的示例中,我使用 .*"status":400.* 来匹配状态 属性。请注意,我将代码作为数字发送,因此如果您想使用字符串,则必须在正则表达式中添加引号。另请注意,将 .* 放在正则表达式的开头和结尾很重要,这样它才能匹配子字符串。
在 API 网关集成响应中设置一个 application/json 内容类型和一个如下所示的映射模板:
$input.path('$.errorMessage')
Lambda 获取您传递给 done/fail 的内容并对其调用 toString()。然后它将该字符串分配为它发送到 API 网关的 JSON 响应中错误消息 属性 的值。
接下来,API 网关将正则表达式应用于错误消息 属性 的值。
最后,API 网关针对 Lambda 响应字符串执行您的映射模板。映射模板从 errorMessage 中提取值并将其呈现为响应主体。
要使 API 网关 return 有多个不同的状态结果,您需要为每个设置单独的集成响应映射。您可以 copy/paste 每个模板都使用相同的模板。
我是 AWS API 网关的新手,我将它与 AWS Lambda (Java) 一起使用。
显然,更改响应状态代码(更改为 4xx、5xx 等)的唯一方法是 return 一个必须与资源的集成响应部分中的 Lambda 错误正则表达式匹配的字符串,或者抛出一个异常还应该包含与正则表达式匹配的消息,对吗?
但是如果我只能 return 一个字符串,我该如何为响应实体提供更多详细信息?
这是我的 RESTful API 用于 return 的内容以及适当的错误状态代码:
{
"code": "123",
"message": "Invalid email address",
"path": "/email"
}
代码属性用于调试或国际化(i18n),路径是要更正的字段。
有时我将它包装在一个 "error" JSON 对象中,有时我 return 一个验证错误列表而不是只有 1 个错误,等等。我根据项目规范自定义它。
如何使用 API 网关生成这样的响应实体?
谢谢。
编辑:感谢 kennbrodhagen 的建议,这是我最终做的事情:
1. 我将错误对象字符串化(使用 Jackson ObjectMapper
)
2. 我抛出一个 RuntimeException
并将字符串化错误作为消息
在集成响应中:
3. 我对 Lambda 错误正则表达式
使用我的一些错误 属性
4.我映射了这个模板
{ "error": $input.path('$.errorMessage') }
然后 API 响应(如果发生错误)变为
{ "error": {"code": "123", ... }}
目前非常基础,但比仅在响应中获取字符串要好。
Apparently the only way to change the response status code (to 4xx, 5xx, etc.) is to return a String that must match the Lambda error regex in the Integration Response section of the resource, or to throw an exception which also should contain a message matching the regex, is that right?
正确。
在目标响应中,您可以配置映射模板,该模板可以访问 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 错误 -> 状态代码映射设置自定义响应主体的唯一方法。
我知道您正在使用 Java,但我对节点更熟悉,所以我更容易以这种方式制作原型。希望它能顺利完成翻译。
这是我在 node.js 中创建的原型函数。目标是 return err 对象作为错误中的 JSON 响应主体。 status 属性 将用于映射到相应的 HTTP 状态。
exports.handler = function(event, context) {
var response = {
status: 400,
message: "Error details",
path: "/x"
}
context.fail(JSON.stringify(response));
};
要使用 status 属性 值映射到 HTTP 400,然后 return 整个结构作为您的 JSON 响应以下:
在 Lambda 中,当您将错误传递给 context.done 或 context.fail 时调用 JSON.stringify() 将其转换为 JSON细绳。由于您使用的是 Java 我假设您会找到一种不同的方法将错误转换为 JSON 等效字符串。
在 API 网关集成响应中设置映射以使用正则表达式匹配包含 JSON 格式的状态代码的 属性 .在下面的示例中,我使用 .*"status":400.* 来匹配状态 属性。请注意,我将代码作为数字发送,因此如果您想使用字符串,则必须在正则表达式中添加引号。另请注意,将 .* 放在正则表达式的开头和结尾很重要,这样它才能匹配子字符串。
在 API 网关集成响应中设置一个 application/json 内容类型和一个如下所示的映射模板:
$input.path('$.errorMessage')
Lambda 获取您传递给 done/fail 的内容并对其调用 toString()。然后它将该字符串分配为它发送到 API 网关的 JSON 响应中错误消息 属性 的值。
接下来,API 网关将正则表达式应用于错误消息 属性 的值。
最后,API 网关针对 Lambda 响应字符串执行您的映射模板。映射模板从 errorMessage 中提取值并将其呈现为响应主体。
要使 API 网关 return 有多个不同的状态结果,您需要为每个设置单独的集成响应映射。您可以 copy/paste 每个模板都使用相同的模板。