Amazon web services 使用AWS API网关和Java处理错误响应状态代码/实体

Amazon web services 使用AWS API网关和Java处理错误响应状态代码/实体,amazon-web-services,aws-lambda,aws-api-gateway,Amazon Web Services,Aws Lambda,Aws Api Gateway,我不熟悉AWS API网关,我将其与AWS Lambda(Java)一起使用。 显然,更改响应状态代码(为4xx、5xx等)的唯一方法是返回一个字符串,该字符串必须与资源的集成响应部分中的Lambda error regex相匹配,或者抛出一个异常,该异常还应包含与regex相匹配的消息,对吗 但是,如果我只能返回一个字符串,如何为响应实体提供更多详细信息? 下面是我的RESTful API用来返回的内容以及相应的错误状态代码: { "code": "123", "message

我不熟悉AWS API网关,我将其与AWS Lambda(Java)一起使用。
显然,更改响应状态代码(为4xx、5xx等)的唯一方法是返回一个字符串,该字符串必须与资源的集成响应部分中的Lambda error regex相匹配,或者抛出一个异常,该异常还应包含与regex相匹配的消息,对吗

但是,如果我只能返回一个字符串,如何为响应实体提供更多详细信息?
下面是我的RESTful API用来返回的内容以及相应的错误状态代码:

{
    "code": "123",
    "message": "Invalid email address",
    "path": "/email"
}
code属性对于调试或国际化(i18n)很有用,路径是要更正的字段。
有时我将其包装在一个“error”JSON对象中,有时我返回一个验证错误列表,而不是仅返回一个错误,等等。我根据项目规范对其进行定制

如何使用API网关生成这样的响应实体?
谢谢

编辑:多亏了肯布罗达根的建议,我终于做到了:
1.我将我的错误对象字符串化(使用Jackson
ObjectMapper

2.我抛出一个
RuntimeException
,将字符串化错误作为消息
在集成响应中:
3.我将我的错误的某些属性用于Lambda error regex
4.我映射了这个模板

{ "error": $input.path('$.errorMessage') }
然后API响应(如果发生错误)变为

现在非常基本,但比只在响应中获取字符串要好

显然,更改响应状态代码(为4xx、5xx等)的唯一方法是返回一个字符串,该字符串必须与资源的集成响应部分中的Lambda error regex相匹配,或者抛出一个异常,该异常还应包含与regex相匹配的消息,对吗

在目标响应中,您可以配置映射模板,该模板可以从Lambda访问响应的任何其他部分以及上下文变量,如下所述:

因此,您可以在“/email”下的400响应上设置映射模板

{
    "code": "123",
    "message": "Invalid email address",
    "path": "$context.resourcePath"
}
或者类似的。这将是为Lambda错误->状态代码映射设置自定义响应主体的唯一方法

显然,更改响应状态代码(为4xx、5xx等)的唯一方法是返回一个字符串,该字符串必须与资源的集成响应部分中的Lambda error regex相匹配,或者抛出一个异常,该异常还应包含与regex相匹配的消息,对吗

在目标响应中,您可以配置映射模板,该模板可以从Lambda访问响应的任何其他部分以及上下文变量,如下所述:

因此,您可以在“/email”下的400响应上设置映射模板

{
    "code": "123",
    "message": "Invalid email address",
    "path": "$context.resourcePath"
}

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

我知道您正在使用Java,但我对node比较熟悉,所以我更容易用这种方式进行原型设计。希望它能顺利翻译过来

这是我在node中创建的原型函数。目标是将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,然后将整个结构作为JSON响应返回,请执行以下操作:

  • 在Lambda中,当您将错误传递给context.done或context.fail时,调用JSON.stringify()将其转换为JSON字符串。因为您使用的是Java,所以我假设您将找到一种不同的方法将错误转换为JSON字符串

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

  • 在API网关集成响应设置中,应用程序/json内容类型和映射模板如下所示:

    $input.path('$.errorMessage')

  • Lambda将您传递的内容转换为done/fail并对其调用toString()。然后,它在发送给API网关的JSON响应中将该字符串指定为errorMessage属性的值

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

    最后,API网关根据Lambda响应字符串执行映射模板。映射模板从errorMessage中提取值,并将其作为响应主体呈现


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

    我知道您正在使用Java,但我更熟悉node,因此我更容易以这种方式进行原型制作。希望它能顺利翻译过来

    这是我在node中创建的原型函数。目标是将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,然后将整个结构作为JSON响应返回,请执行以下操作:

  • 在Lambda中,当您将错误传递给context.done或context.fail时,调用JSON.stringify()将其转换为JSON字符串。因为您使用的是Java,所以我假设您将找到一种不同的方法将错误转换为JSON字符串