AWS Lambda错误:当url参数包含JSON数组时,"无法将请求主体解析为json"

ARU*_* NV 3 json amazon-web-services aws-lambda aws-api-gateway

我试图通过传递如下参数来调用我的Lambda函数.它包含撇号(').

https://invoke_url?param=[["kurlo jack's book","Adventure Books",8.8,1]]
Run Code Online (Sandbox Code Playgroud)

字符串化为 ' https:// invoke_url?param =%5B%5B%229780786706211%22s ....`

我使用下面的映射将参数传递给lambda

  "query": {
    #foreach($queryParam in $input.params().querystring.keySet())
    "$queryParam": "$util.escapeJavaScript($input.params().querystring.get($queryParam))" #if($foreach.hasNext),#end

    #end
  }  
Run Code Online (Sandbox Code Playgroud)

我收到了以下错误

{"message": "Could not parse request body into json: Unrecognized character escape \'\'\' (code 39)\n at [Source: [B@5b70c341; line: 29, column: 65]"}  
Run Code Online (Sandbox Code Playgroud)

从映射模板中删除双引号后我也尝试过.但是没有用.

小智 6

务必在之后添加.replaceAll("\\'","'")到您的请求正文直通模板中.escapeJavaScript(data)

我发现AWS的文档中的这一点对此问题非常有帮助:

$ util.escapeJavaScript()

使用JavaScript字符串规则转义字符串中的字符.

注意此函数会将任何常规单引号(')转换为转义符(\').但是,转义的单引号在JSON中无效.因此,当在JSON属性中使用此函数的输出时,必须将任何转义的单引号(\')转回常规单引号(').这在以下示例中显示: $util.escapeJavaScript(data).replaceAll("\\'","'")


iSk*_*ore 0

“查询字符串”(超链接中 后面的部分?)必须是string. 无论您有什么构造,都必须附加到它后面,例如:https://invoke_url?a=x&b=y

在您的 Lambda 代码中输入:

if( event.hasOwnProperty( 'params' ) )
    if( event.params.hasOwnProperty( 'querystring' ) )
        params = event.params.querystring;
Run Code Online (Sandbox Code Playgroud)

(显然一些无关的检查,可能没有必要,但是呃)

在您的 API 网关中,转到:

APIs -> api_name -> Resources -> invoke_url -> GET -> Method Execution

在 URL 查询字符串参数下“添加查询字符串”ab(或其他)

当您点击时,www.com/invoke_url?a=x&b=y您现在可以通过以下方式访问它们:

...
params = event.params.querystring;
console.log( params.a, params.b );
...
Run Code Online (Sandbox Code Playgroud)