如果我的Lambda使用消息Exception
抛出404
,则API网关中显示的响应为
{
"errorMessage":"404",
"errorType":"java.lang.Exception",
"stackTrace":[..."]
}
我可以在errorMessage上匹配以影响HTTP结果。
但是,如果我有效地返回相同的结果,即:
{
"errorMessage":"404",
"errorType":"Error"
}
API Gateway似乎无法识别出错误并始终返回200。
有没有办法让我的好功能代码在不抛出异常的情况下发出错误信号?
答案 0 :(得分:2)
Lambda函数必须以错误退出,以便评估响应模式 - 只需在成功的Lambda响应中返回“errorMessage”字段,就不可能“伪造”错误响应。
https://aws.amazon.com/blogs/compute/error-handling-patterns-in-amazon-api-gateway-and-aws-lambda/
答案 1 :(得分:1)
这更多是一个通用问题,而不是与Java相关的问题,因为AWS API Gateway集成与编写AWS Lambda函数的语言无关。
您可以按照以下AWS文档中的准则来实现返回自定义错误消息:Handle Custom Lambda Errors in API Gateway
对于Lambda自定义集成,您必须将Lambda在集成响应中返回的错误映射到客户端的标准HTTP错误响应。否则,默认情况下,Lambda错误将作为200 OK响应返回,并且对于您的API用户而言,结果不直观。
Lambda可以返回两种错误:
在您的API中,您必须以不同的方式处理这些问题。
通过Lambda代理集成,要求Lambda返回以下格式的输出:
{
"isBase64Encoded" : "boolean",
"statusCode": "number",
"headers": { ... },
"body": "JSON string"
}
在此输出中,对于客户端错误,statusCode通常为4XX,对于服务器错误,statusCode通常为5XX。 API网关根据指定的statusCode通过将Lambda错误映射到HTTP错误响应来处理这些错误。为了使API网关传递错误类型(例如InvalidParameterException)作为对客户端的响应,Lambda函数必须在标头中包含标头(例如“ X-Amzn-ErrorType”:“ InvalidParameterException”)属性。
有关更多详细信息,请在此处从AWS上查看此官方文档:Handle Lambda Errors in API Gateway
答案 2 :(得分:0)
我认为这更多是设计问题,而不是Java / AWS问题。
AWS lambda的预期设计是...当您的代码有内部问题时,如果客户端尝试访问不存在的内容(400或300),它将返回500(难看的)。无论使用哪种框架(Java Spring和Python Django等都是如此)都是如此。
如果您的函数很好地检测到错误并返回了一个完美的对象(json),那么(根据定义)它不是代码的内部问题。换句话说,您的代码按预期运行。就lambda而言,它是200 ok。
如果您想要丑陋的响应(5xx),则需要抛出错误/异常。否则,lambda会认为您的代码很好,并且您在json中抛出的任何错误都是正常的有效负载。这并不是说您不应该在json响应中编码错误。包含特定于应用程序/业务逻辑的错误以传递这样的有效负载是完全正常的。
我希望这能回答您的问题。简而言之,
除了抛出错误,没有其他方法让lambda返回5xx,并且 这是预期的行为。