从Perl调用数据参数中带有特殊字符的REST API失败

时间:2018-12-18 12:22:11

标签: perl servicenow

我试图从perl调用servicenow rest api来更新一些数据属性。

我正在使用curl命令来实现此目的,由于某些原因,我无法使用任何可用的perl模块。

我能够成功实现此目标,而json的value字段中没有任何特殊字符。

以下是用于格式化cmd的代码:

my $comments = "b'c";
my $cmd = `curl \"$url\" -i -s --insecure --user test:test --request PUT --header "Accept:application/json" --header "Content-Type:application/json"  --data '{\"comments\":\"$comments\"}'`;

如果上面的值为“ bc”,我可以获取数据,但是如果我给出“ b'c”,则出现以下错误:

sh: -c: line 0: unexpected EOF while looking for matching `"'

sh: -c: line 1: syntax error: unexpected end of file

即使我尝试了以下代码:

my $cmd = system "curl https://test.service-now.com/api/now/table/incident/code?sysparm_display_value=true -i -s --insecure --request PUT --header \"Accept:application/json\" --header \"Content-Type:application/json\"  --data '{\"comments\":\"bc\"}' --user test:test";

如果给出一个带有单引号b'c的字符串,则会出现相同的错误。

有人可以告诉我如何处理双引号字符串中的单引号吗?

1 个答案:

答案 0 :(得分:1)

我可以使用它

my $comments = "b\"'\"c";

然后传递给外壳的字符串是

--data '{"comments":"b'"'"'c"}'

是串联在一起的三个单独的标记:

'{"comments":"b'       resolves to    {"comments":"b
"'"                    resolves to    '
'c"}'                  resolves to    c"}

另请参阅String::ShellQuote,这是解决此类问题的天赐之物。

use String::ShellQuote;
$comments = "b'c";
@cmd = ("curl", $URL, "-i", "-s", "--insecure", "--request",
        "PUT", "--header", "Accept:applicatin/json", "--header",
        "Content-Type:application/json",
        "--data", qq[{"comments":$comments}], "--user", "test:test");
$cmd = shell_quote(@cmd);
print $cmd;

给你:

curl 'https://test.service-now.com/api/now/table/incident/code?sysparm_display_value=true' 
    -i -s --insecure --request PUT --header 
    Accept:application/json --header Content-Type:application/json 
    --data '{"comments":"b'\''c"}' --user test:test

这也将满足shell的语法检查器的要求。