В соответствии с требованиями приложения, я пытаюсь разработать два PHP, которые могут общаться друг с другом через Json. Я попробовал поиск в Интернете, но не нашел решение.
Может ли кто-нибудь предложить мне правильный путь для этого?
У меня есть данные в базе данных mysql, конвертированные данные будут в формате json, как указано ниже: (Также ищите код для получения этого формата данных через объект и массив PHP-JSON).
{ "user" : [ { "firstName" : "Vignesh", "lastName" : "Prajapati", "age" : 23, "email" : ["vignesh@gmail.com","vignesh@yahoo.com"], "subject" : ["English","Gujarati", "Hindi"] }, { "firstName" : "Vaibhav", "lastName" : "Prajapati", "age" : 19, "email" : ["vaibhav@gmail.com","vaibhav@yahoo.com","vaibhav@aol.com"], "subject" : ["English","Spanish", "Chinese","Sanskrit"] } ] }
Мой Php-код для отправки Json-данных: (send.php)
<?php $data = ' { "user" : [ { "firstName" : "Vignesh", "lastName" : "Prajapati", "age" : 23, "email" : ["vignesh@gmail.com","vignesh@yahoo.com"], "subject" : ["English","Gujarati", "Hindi"] }, { "firstName" : "Vaibhav", "lastName" : "Prajapati", "age" : 19, "email" : ["vaibhav@gmail.com","vaibhav@yahoo.com","vaibhav@aol.com"], "subject" : ["English","Spanish", "Chinese","Sanskrit"] } ] } '; $url_send ="http://localhost/rec.php"; $str_data = json_encode($data); function sendPostData($url, $post){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS,$post); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $result = curl_exec($ch); curl_close($ch); // Seems like good practice return $result; } echo " " . sendPostData($url_send, $str_data); ?>
Мой код Php для получения данных Json: (rec.php)
<?php $json_input_data=json_decode(file_get_contents('php://input'),TRUE); echo $json_input_data; ?>
Измените свою функцию для отправки заголовка JSON_DATA в почтовом запросе
function sendPostData($url, $post){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS,$post); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($post)) ); $result = curl_exec($ch); curl_close($ch); // Seems like good practice return $result; }
В использовании файлов
<?php $json_input_data=json_decode(file_get_contents('php://input'),TRUE); print_r( $json_input_data); ?>
Поскольку все сказали, что нет необходимости в $str_data = json_encode($data);
, Так как данные уже находятся в json.
Помните, что JSON означает «объектная нотация», то есть это способ описать объект в javascript. Это отличный способ общения на сетевом уровне, но когда вы находитесь на PHP, вы должны использовать структуры данных, которые PHP предназначен для использования. Вместо того, чтобы работать с JSON напрямую с каждой стороны, и особенно в качестве альтернативы большой строке JSON, храните эти данные в виде массива и кодируйте их прямо перед отправкой. Ваш подход с завивкой в порядке, хотя и немного обычен – есть много хороших маршрутизаторов, которые лучше справляются с управлением этими типами запросов (symfony – мой любимый), но это отдельная проблема.
например, вместо вашей большой строки, представляйте ее как:
$data = [ "user" => [ [ "firstName" => "Vignesh", "lastName" => "Prajapati", "age" => 23, "email" => ["vignesh@gmail.com","vignesh@yahoo.com"], "subject" => ["English","Gujarati", "Hindi"] ]
и т. д. Когда придет время отправить его на другой сервер, json_encode
и перейдите.
Поскольку вы не должны использовать json_encode
если данные уже находятся в json
формате, измените код на что-то вроде:
$data = array('user' => array( array('firstName' => 'Vignesh', 'lastName' => 'Prajapati'), array('firstName' => 'Vaibhav', 'lastName' => 'Prajapati') ));
Конечно, вам нужно будет добавить и другие поля в массив.
Использование json_encode()
для приведенных выше данных вернет:
{ "user" : [ { "firstName" : "Vignesh", "lastName" : "Prajapati" }, { "firstName" : "Vaibhav", "lastName" : "Prajapati" } ] }