AmazonWeb服务—有没有任何方法可以在不引发异常的情况下在aws lambda for java中发出错误信号?

a6b3iqyw  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(548)

如果我的lambda抛出一个 Exception 带着信息 404 那么在api网关中看到的响应是

{
  "errorMessage":"404",
  "errorType":"java.lang.Exception",
  "stackTrace":[..."]
}

我可以匹配错误消息来影响http结果。
但是,如果我有效地返回相同的结果,即:

{
  "errorMessage":"404",
  "errorType":"Error"
}

api网关似乎没有意识到有错误,总是返回一个200。
有没有什么方法可以让我漂亮的函数代码在不引发异常的情况下发出错误信号?

k2fxgqgv

k2fxgqgv1#

lambda函数必须带着错误退出,才能评估响应模式—不可能通过在成功的lambda响应中简单地返回“errormessage”字段来“伪造”错误响应。
https://aws.amazon.com/blogs/compute/error-handling-patterns-in-amazon-api-gateway-and-aws-lambda/

klh5stk1

klh5stk12#

我认为这更像是一个设计问题,而不是java/aws问题。
aws lambda的预期设计是。。。当您的代码有内部问题时,它将返回500(丑陋的),而如果客户机试图达到不存在的东西(400或300)。不管框架是什么,这都是正确的(JavaSpring和PythonDjango等也是如此)
如果您的函数能够很好地检测到错误并返回一个完美的对象(json),那么它(根据定义)就不是代码的内部问题。换句话说,您的代码按预期运行。就兰博达而言,200是可以的。
如果你想要丑陋的响应(5xx),你需要抛出一个错误/异常。否则,lambda会认为您的代码很好,无论您在json中抛出什么错误,都是正常的负载。这并不是说不应该在json响应中编码错误。包含特定于应用程序/业务逻辑驱动的错误以这样传递有效负载是完全正常的。
我希望这能回答你的问题。总之,
没有其他方法可以让lambda返回5xx,而不是抛出一个错误,这是预期的行为。

b1uwtaje

b1uwtaje3#

这更像是一个一般性的问题,而不是与java相关的问题,因为awsapi网关集成与编写aws lambda函数的语言没有太大关系。
您可以通过以下aws文档中的指导来实现返回自定义错误消息:在api网关中处理自定义lambda错误
对于lambda自定义集成,必须将集成响应中lambda返回的错误Map到客户端的标准http错误响应。否则,lambda错误在默认情况下返回为200个ok响应,结果对api用户来说不是直观的。
lambda可以返回两种类型的错误:
标准误差
自定义错误
在api中,必须以不同的方式处理这些问题。
通过lambda代理集成,lambda需要返回以下格式的输出:

{
  "isBase64Encoded" : "boolean",
  "statusCode": "number",
  "headers": { ... },
  "body": "JSON string"
}

在此输出中,对于客户端错误,statuscode通常为4xx,对于服务器错误,statuscode通常为5xx。api网关根据指定的状态码,通过将lambda错误Map到http错误响应来处理这些错误。为了让api网关传递错误类型(例如,invalidparameterexception),作为对客户端响应的一部分,lambda函数必须在headers属性中包含一个头(例如,“x-amzn-errortype”:“invalidparameterexception”)。
有关更多详细信息,请在此处查看aws的官方文档:在api网关中处理lambda错误

相关问题