我的Lambda函数中有class BadRequest(Exception): pass
。
我想raise BadRequest("Invalid request params")
并让API返回一个状态代码为400和body{ "message": "Invalid request params" }
的响应(或等效的)。
不过,简单地这样做会返回一个状态代码为200的响应(哦,不!)和身体
{
"errorMessage": "Invalid request params",
"errorType": "BadRequest",
"stackTrace": <my application code that the user shouldnt see>
}
在网上搜索之后,我似乎有三个选择:
1)
chalice
2)使用集成响应和方法响应将错误解析为更好的响应。我希望正则表达式
[BadRequest].*
并在抛出异常时插入前缀(不是很优雅的IMO)。3)使用Step Functions创建API的状态表示。这似乎有点乏味,因为我需要学习ASL,我不认识任何聋人。-.-
-.-amazon states language
我应该去哪个兔子洞,为什么?
最佳答案
您应该捕获Lambda中的异常并抛出自定义异常,如下所示。
public class LambdaFunctionHandler implements RequestHandler<String, String> {
@Override
public String handleRequest(String input, Context context) {
Map<String, Object> errorPayload = new HashMap();
errorPayload.put("errorType", "BadRequest");
errorPayload.put("httpStatus", 400);
errorPayload.put("requestId", context.getAwsRequestId());
errorPayload.put("message", "Invalid request params " + stackstace);
String message = new ObjectMapper().writeValueAsString(errorPayload);
throw new RuntimeException(message);
}
}
And then use Option 2 to map the error code .
Integration response:
Selection pattern: “.*"BadRequest".*”
Method response: 500
Mapping template:
#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))
{
"type" : "$errorMessageObj.errorType",
"message" : "$errorMessageObj.message",
"request-id" : "$errorMessageObj.requestId"
}