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

时间:2016-09-02 11:14:13

标签: json amazon-web-services aws-lambda aws-api-gateway

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

https://invoke_url?param=[["kurlo jack's book","Adventure Books",8.8,1]]

字符串化为'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
  }  

我收到了以下错误

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

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

4 个答案:

答案 0 :(得分:6)

请务必在.replaceAll("\\'","'")

之后将.escapeJavaScript(data)添加到您的请求正文直通模板

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

  

$ util.escapeJavaScript()

     

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

     

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

答案 1 :(得分:1)

我没有解决方案,但我缩小了根本原因。 Lambda似乎不喜欢用单斜杠转义单引号。

如果您将映射模板硬编码为如下所示:

{
    "query-fixed": {
        "param": "[[\"kurlo jack\\'s book\",\"Adventure Books\",8.8,1]]"
    }
}

我的测试Lambda调用成功。但是,如果您将模板硬编码为:

{
    "query-fixed": {
        "param": "[[\"kurlo jack\'s book\",\"Adventure Books\",8.8,1]]"
    }
}

我收到您上面提到的相同错误消息。不幸的是,第二个变体是API Gateway为Lambda调用生成的内容。

解决方法可能涉及使用模板将使用斜杠转义的单引号替换为两个斜杠。见Replace a Substring of a String in Velocity Template Language

我会在内部跟进Lambda并在听到任何内容或有功能解决方法时进行更新。

答案 2 :(得分:0)

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

在您的Lambda代码中:

if( event.hasOwnProperty( 'params' ) )
    if( event.params.hasOwnProperty( 'querystring' ) )
        params = event.params.querystring;

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

在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 );
...

答案 3 :(得分:0)

根据this W3Schools page中定义的内容,尝试将'的编码更改为%27(具有讽刺意味的是,他们的示例也没有对单引号进行编码,我想因为它属于“支持” “ASSCII字符集”