Вызвать REST API со специальными символами в параметрах данных из Perl не удается - PullRequest
0 голосов
/ 18 декабря 2018

Из perl я пытаюсь вызвать api servicenow rest для обновления некоторых атрибутов данных.

Я использую команду curl для достижения этой цели, и по некоторым причинам я не могу использовать ни один из модулей perlдоступно.

Я могу добиться этого без каких-либо специальных символов в поле значения json.

Ниже приведен код, используемый для форматирования 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 голосов
/ 18 декабря 2018

Я могу заставить это работать с

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

, что также удовлетворитсредство проверки синтаксиса оболочки.

...