Я прочитал несколько вопросов по теме здесь, но не смог найти ответ, который я ищу. Я делаю $ .post с jQuery на сервере PHP5.6.
$.post('/', {a:100, b:'test'}, function(data){ }, 'json');
Кодировка с консоли
Content-Type application/x-www-form-urlencoded; charset=UTF-8
Если я попытаюсь прочитать данные POST с помощью обычного $ _POST, PHP5.6 предупреждает меня
PHP Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead
Итак, я попробовал это предложение, добавил always_populate_raw_post_data = -1 в php.ini и
json_decode(file_get_contents("php://input"));
PHP5.6 предупреждает меня, что он недействителен
PHP Warning: First parameter must either be an object or the name of an existing class
Поэтому я выкинул file_get_contents («php: // input»), и это строка.
a=100&b="test"
Поэтому я проанализировал строку и закодировал, затем расшифровал
parse_str(file_get_contents("php://input"), $data); $data = json_decode(json_encode($data)); var_dump($data);
И, наконец, я наконец получил свои $ data как объект, а не массив, как истинный объект JSON.
Я прибегал к использованию $ _POST на данный момент … Но потом мне интересно, как обновить PHP.
Вопрос здесь в том, что есть ли более прямое решение для этого или это означает, что использование file_get_contents («php: // input») также означает выполнение синтаксического анализа синтаксического кодирования декодирования?
Изменить: так кажется, что это не работает ни на нескольких уровнях json's. Рассмотрим следующее:
{"a":100, "b":{"c":"test"}}
Как отправлено в Ajax / Post
{a:100, b:{c:"test"}}
дела
parse_str(file_get_contents("php://input"), $post); var_dump($post);
Выйдет
array(2) { ["a"]=>string(8) "100" ["b"]=>string(16) "{"c":"test"}" }
Или делать (как было предложено)
parse_str(file_get_contents("php://input"), $post); $post= (object)$post;
Выйдет
object(stdClass)#11 (2) { ["a"]=>string(8) "100" ["b"]=>string(16) "{"c":"test"}"
}
Как преобразовать file_get_contents ("php: // input") в истинный объект с той же «архитектурой» без использования рекурсивной функции?
Edit2: Моя ошибка, предложенная работа, я получил сторону в комментариях с JSON.stringify, которые вызвали ошибку. Итог: он работает с json_decode (json_encode ($ post)) или $ post = (object) $ post;
Напомним, используя jQuery $ .post:
$.post('/', {a:100, b:{c:'test'}}, function(data){ }, 'json'); parse_str(file_get_contents("php://input"), $data); $data = json_decode(json_encode($data));
или
parse_str(file_get_contents("php://input"), $data); $data= (object)$data;
Не нужно использовать JSON.stringify
Получая данные POST с сериализованным / urlencoded в тексте POST запроса, как вы, вы правильно преобразовали его в массив с parse_str()
уже.
Однако шаг кодирования, а затем декодирование JSON для того, чтобы преобразовать его в объект (в отличие от массива ), который вы ищете, не является необходимым. Вместо этого PHP с радостью передаст ассоциативный массив в объект класса stdClass
:
parse_str(file_get_contents("php://input"), $data); // Cast it to an object $data = (object)$data; var_dump($data);
Немного больше информации доступно в документации PHP по типу литья .
Чтобы отправить сырые данные json, вы должны остановить jQuery от url-encoding:
data = {"a":"test", "b":{"c":123}}; $.ajax({ type: 'POST', url: '...', data: JSON.stringify(data), // I encode it myself processData: false // please, jQuery, don't bother });
На стороне php просто прочитайте php://input
и json_decode
:
$req = file_get_contents("php://input"); $req = json_decode($req);
Моя ошибка, предложенная работа, я получил сторону, отслеживаемую в комментариях с JSON.stringify, которая вызвала ошибку. Итог: он работает с json_decode (json_encode ($ post)) или $ post = (object) $ post; Ответ Майкла был прав, но стороны отслеживали меня, и я оставил ошибку в своем коде. JSON.stringify полезен только при отправке данных из формы, как я ответил в комментарии.