我的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"
}

08-07 13:45