使用PHP读取JSON POST

在发布这个问题之前,我环视了很多,所以我很抱歉,如果它在另一个post,这只是我在这里的第二个问题,所以道歉,如果我不正确格式化这个问题。

我有一个非常简单的Web服务,我已经创build需要采取后值,并返回一个JSON编码数组。 这一切都工作得很好,直到我被告知我需要张贴表单数据的内容types的应用程序/ JSON。 从那时起,我不能从Web服务返回任何值,这绝对是我如何过滤他们的后值。

基本上在我的本地设置,我已经创build了一个testing页面,执行以下操作 –

$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); 

在web服务我有这个(我已经剥离了一些function) –

 <?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”)和其他一些方法,但是我在黑暗中拍了一下。

任何帮助将不胜感激。

谢谢,史蒂夫

感谢迈克尔的帮助,这是一个明确的一步,我现在至less得到一个repsonse,当我回声的职位….即使它是空的

更新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)); 

正如我所说,至less我现在看到一个回应,现在是在它返回一个空白页之前

你有空的$_POST 。 如果您的Web服务器想要以json格式查看数据,则需要读取原始input,然后使用JSON解码进行parsing。

你需要这样的东西:

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

你也有错误的代码来testingJSON通信…

CURLOPT_POSTFIELDS告诉curl将你的参数编码为application/x-www-form-urlencoded 。 你需要JSONstring在这里。

UPDATE

你的testing页面的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); 

同样在你的web服务页面上,你应该删除一行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:

 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); 

在服务端你可以得到你的jsonstring作为参数:

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

那么你可以使用转换的数据作为对象。