NodeJS JSON.stringify отправляет аргумент в PHP json_decode - возвращает null

Я звоню в файл PHP из приложения nodejs и отправляю аргумент, в то время как один из аргументов должен быть JSON (конечно, в виде строки)

Это не работает должным образом, так как строка выглядит как несколько аргументов и должна быть экранирована или правильно.

Пытаясь разделить проблему, я создал новый файл php, пытаясь выполнить извне (в этом примере из командной строки) ->

выполнение следующей команды

php test.php {"access_token":"acccess_token","id_token":"id_token","refresh_token":"refresh-token","token_type":"token_type","expiry_date":1515578624982,"expires_in":3600}

вот пример кода, который терпит неудачу

<?php
$json = $argv[1];

$res = json_decode($json,true);
echo "CHECK-ERROR".json_last_error().PHP_EOL."-----".PHP_EOL;

echo "END RESULTS".PHP_EOL.$res.PHP_EOL."-------".PHP_EOL;

?>

вот результат

введите здесь описание изображения

Итак, несколько интересных фактов: - Изменение кода для использования аргумента в качестве локальной переменной - отлично работает. - помещение json в одинарные кавычки '{...}' - отлично работает. - вызов php из NodeJS с использованием '${jsonStringified}' - работает нормально. (поскольку это та же идея, что и вышеупомянутое

Вопрос в том, какие другие решения существуют? (например, кодирование, экранирование), а не эту небольшую настройку?


person rabashani    schedule 10.01.2018    source источник


Ответы (1)


Во-первых, вы не определили $argv[1]. Во-вторых, это не JSON в глазах PHP, это строка, поэтому она должна быть закодирована в JSON, прежде чем PHP ее прочитает.

Командная строка:

php test.php "{ \"access_token\": \"acccess_token\", \"id_token\": \"id_token\", \"refresh_token\": \"refresh-token\", \"token_type\": \"token_type\", \"expiry_date\": 1515578624982, \"expires_in\": 3600 }"

PHP-скрипт:

$json = json_decode($_SERVER['argv']['1'], true);

if (json_last_error()) { var_dump($_SERVER['argv']['1']); die(); }

echo "CHECK-ERROR".json_last_error().PHP_EOL."-----".PHP_EOL;

echo "END RESULTS".PHP_EOL.json_encode($json).PHP_EOL."-------".PHP_EOL;

Должен сделать трюк.

person Anuga    schedule 10.01.2018
comment
1) $argv документация 2) JSON есть строка по определению, и ОП уже декодирует ее как таковую. - person deceze♦; 10.01.2018
comment
Никогда не доверяйте переменным, зависящим от настроек: php.net/manual/ en/ini.core.php#ini.register-argc-argv - person Anuga; 10.01.2018
comment
Конечно, но вы недостаточно знаете, чтобы категорически заявить, что $argv не определено. - person deceze♦; 10.01.2018
comment
Используя $_SERVER, мне не нужно знать;) - person Anuga; 10.01.2018