AWS API Gateway如何校验JSON查询参数并拦截无效请求?
AWS API Gateway请求参数校验方案
可以在请求发送至HTTP集成前完成必填参数及JSON格式的校验,并拦截无效请求返回自定义错误。你之前的代码逻辑有效但存在语法和异常处理问题,导致触发500内部服务器错误,以下是修正后的方案:
修正后的集成请求映射模板代码
## 捕获JSON解析异常,避免直接抛出500错误 #set($valid = true) #set($statusCode = 200) #set($errorMsg = "") #try #set($filterJSON = $util.parseJson($input.params('filter'))) ## 校验where子句及parameterB是否存在 #if(!$filterJSON.containsKey("where") || !$filterJSON.where.containsKey("parameterB")) #set($valid = false) #set($statusCode = 400) #set($errorMsg = "A parameterB filter should be specified inside a where clause.") #end #catch($e) #set($valid = false) #set($statusCode = 400) #set($errorMsg = "Invalid JSON format for 'filter' parameter.") #end ## 若请求无效,覆盖响应状态和内容 #if(!$valid) #set($context.responseOverride.status = $statusCode) #set($context.responseOverride.responseBody = "{ \"error\": { \"statusCode\": $statusCode, \"name\": \"ValidationError\", \"message\": \"$errorMsg\" } }") ## 终止请求,不再转发到集成端点 $util.abort($statusCode, $errorMsg) #end ## 验证通过后,正常转发请求(保留原请求映射逻辑) $input.json('$')
关键改进说明
- 异常捕获:用
#try/#catch包裹$util.parseJson,避免非法JSON直接抛出未处理异常导致500错误。 - 语法修正:修正变量定义的括号错误(如
#set($status = 400)而非#set($status) = 400)。 - JSON格式合规:响应体中的字符串用转义双引号包裹,确保返回合法JSON结构。
- 请求终止:使用
$util.abort()在验证失败时直接终止请求,不再执行后续集成逻辑。 - 可靠存在性校验:用
containsKey()替代$util.json.contains(),更准确判断JSON对象的键是否存在。
额外优化方案:结合API Gateway模型验证
除了映射模板,还可以用API Gateway的模型验证提前校验参数格式:
- 创建JSON Schema模型,定义
filter参数的结构要求:
{ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "required": ["where"], "properties": { "where": { "type": "object", "required": ["parameterB"], "properties": { "parameterB": { "type": "string" } } } } }
- 在API的请求验证设置中,将
filter参数关联到该模型,API Gateway会自动校验JSON格式和结构,不符合时返回400错误。 - 再结合映射模板处理更复杂的业务校验,或自定义错误响应内容。
内容的提问来源于stack exchange,提问作者pollinho
相关产品推荐
相关产品推荐

