Чтение JSON POST с использованием PHP

Я много огляделся, прежде чем публиковать этот вопрос, поэтому приношу свои извинения, если он находится на другом посту, и это только мой второй quesiton, поэтому извиняюсь, если я не правильно отформатирую этот вопрос.

У меня действительно простой веб-сервис, который я создал, который должен принимать post-значения и возвращать JSON-кодированный массив. Все это работало нормально, пока мне не сказали, что мне нужно будет отправить данные формы с помощью типа приложения / json. С тех пор я не могу вернуть какие-либо значения из веб-службы, и это определенно связано с тем, как я фильтрую свои значения post.

В основном в моей локальной настройке я создал тестовую страницу, которая делает следующее:

$curl = curl_init(); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data)) ); curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/'); // Set the url path we want to call $result = curl_exec($curl); //see the results $json=json_decode($result,true); curl_close($curl); print_r($json); 

На веб-сервисе у меня это (я снял некоторые функции) –

 <?php header('Content-type: application/json'); /* connect to the db */ $link = mysql_connect('localhost','root','root') or die('Cannot connect to the DB'); mysql_select_db('webservice',$link) or die('Cannot select the DB'); if(isset($_POST['action']) && $_POST['action'] == 'login') { $statusCode = array('statusCode'=>1, 'statusDescription'=>'Login Process - Fail'); $posts[] = array('status'=>$statusCode); header('Content-type: application/json'); echo json_encode($posts); /* disconnect from the db */ } @mysql_close($link); ?> 

В основном я знаю, что это связано с тем, что значения $ _POST не установлены, но я не могу найти то, что мне нужно, вместо $ _POST. Я попробовал json_decode ($ _ POST), file_get_contents («php: // input») и ряд других способов, но я немного стрелял в темноту.

Любая помощь будет принята с благодарностью.

Спасибо, Стив

Спасибо Майклу за помощь, это был определенный шаг вперед. У меня теперь, по крайней мере, есть ответ, когда я повторяю пост … даже если он равен нулю

обновленный CURL –

  $curl = curl_init(); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); 

обновленный php на странице, на которой данные отправлены –

 $inputJSON = file_get_contents('php://input'); $input= json_decode( $inputJSON, TRUE ); //convert JSON into array print_r(json_encode($input)); 

Как я сказал, по крайней мере, я вижу ответ сейчас, прежде чем он вернул пустую страницу

У вас пустой $_POST . Если ваш веб-сервер хочет видеть данные в json-формате, вам нужно прочитать исходный ввод, а затем проанализировать его с помощью JSON-декодирования.

Вам нужно что-то вроде этого:

 $json = file_get_contents('php://input'); $obj = json_decode($json); 

Также у вас неправильный код для тестирования JSON-общения …

CURLOPT_POSTFIELDS сообщает curl для кодирования ваших параметров как application/x-www-form-urlencoded . Здесь вам нужна JSON-строка.

ОБНОВИТЬ

Ваш PHP-код для тестовой страницы должен быть таким:

 $data_string = json_encode($data); $ch = curl_init('http://webservice.local/'); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)) ); $result = curl_exec($ch); $result = json_decode($result); var_dump($result); 

Также на странице веб-сервиса вы должны удалить один из header('Content-type: application/json'); строк header('Content-type: application/json'); , Его нужно вызывать только один раз.

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

 $ip_srv = array("http://freegeoip.net/json/$this->ip","http://smart-ip.net/geoip-json/$this->ip"); getUserLocation($ip_srv); 

Функция:

 function getUserLocation($services) { $ctx = stream_context_create(array('http' => array('timeout' => 15))); // 15 seconds timeout for ($i = 0; $i < count($services); $i++) { // Configuring curl options $options = array ( CURLOPT_RETURNTRANSFER => true, // return web page //CURLOPT_HEADER => false, // don't return headers CURLOPT_HTTPHEADER => array('Content-type: application/json'), CURLOPT_FOLLOWLOCATION => true, // follow redirects CURLOPT_ENCODING => "", // handle compressed CURLOPT_USERAGENT => "test", // who am i CURLOPT_AUTOREFERER => true, // set referer on redirect CURLOPT_CONNECTTIMEOUT => 5, // timeout on connect CURLOPT_TIMEOUT => 5, // timeout on response CURLOPT_MAXREDIRS => 10 // stop after 10 redirects ); // Initializing curl $ch = curl_init($services[$i]); curl_setopt_array ( $ch, $options ); $content = curl_exec ( $ch ); $err = curl_errno ( $ch ); $errmsg = curl_error ( $ch ); $header = curl_getinfo ( $ch ); $httpCode = curl_getinfo ( $ch, CURLINFO_HTTP_CODE ); curl_close ( $ch ); //echo 'service: ' . $services[$i] . '</br>'; //echo 'err: '.$err.'</br>'; //echo 'errmsg: '.$errmsg.'</br>'; //echo 'httpCode: '.$httpCode.'</br>'; //print_r($header); //print_r(json_decode($content, true)); if ($err == 0 && $httpCode == 200 && $header['download_content_length'] > 0) { return json_decode($content, true); } } } 

вы можете поместить свой json в параметр и отправить его вместо того, чтобы помещать только ваш json в заголовок:

 $post_string= 'json_param=' . json_encode($data); //open connection $ch = curl_init(); //set the url, number of POST vars, POST data curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS, $post_string); curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/'); // Set the url path we want to call //execute post $result = curl_exec($curl); //see the results $json=json_decode($result,true); curl_close($curl); print_r($json); 

на стороне обслуживания вы можете получить строку json в качестве параметра:

 $json_string = $_POST['json_param']; $obj = json_decode($json_string); 

то вы можете использовать преобразованные данные как объект.