Serverless切换Lambda集成后,AWS Gateway查询参数Filter解析错误求助
问题:Lambda Integration下查询参数转义导致JSON解析失败
我使用Serverless框架,近期已从Lambda Proxy Integration切换为Lambda Integration。目前有一个端点需在查询参数中使用Filter,使用以下请求模板映射查询字符串:
"queryStringParameters": { #foreach($query in $request_query.keySet()) "$query" : "$util.escapeJavaScript($request_query.get($query))" #if($foreach.hasNext),#end #end }
该端点地址:https://example.com/ds/districts?page=1&pagesize=12&filtercriteria=name~%27John%27
调用此端点时出现错误:
Could not parse request body into json: Could not parse payload into json: Unrecognized character escape \'\'\' (code 39)\n at [Source: (byte[])\"
问题原因
$util.escapeJavaScript()会将单引号转义为\',但JSON语法中仅要求双引号需要转义,单引号无需处理。当查询参数里的%27(即单引号')被转义成\'后,生成的JSON内容不符合规范,最终导致解析失败。
解决方案
方案1:仅解码URL编码字符
不需要使用$util.escapeJavaScript(),改用$util.urlDecode()解码URL编码的字符后直接包裹双引号即可,JSON内部的单引号无需转义:
"queryStringParameters": { #foreach($query in $request_query.keySet()) "$query" : "$util.urlDecode($request_query.get($query))" #if($foreach.hasNext),#end #end }
方案2:适配JSON转义规则
如果需要处理双引号、反斜杠等JSON敏感字符,使用$util.escapeJson()替代$util.escapeJavaScript(),该方法是专门为JSON格式设计的转义工具:
"queryStringParameters": { #foreach($query in $request_query.keySet()) "$query" : "$util.escapeJson($util.urlDecode($request_query.get($query)))" #if($foreach.hasNext),#end #end }
说明
$util.urlDecode():负责将URL编码的字符(如%27)解码为原始字符(')$util.escapeJson():仅转义JSON语法要求的特殊字符,确保生成的内容完全符合JSON规范
内容的提问来源于stack exchange,提问作者karPower
相关产品推荐
相关产品推荐

