2013-09-25 80 views
51

Tôi đã xem xét rất nhiều trước khi đăng câu hỏi này để xin lỗi nếu nó ở trên một bài đăng khác và đây chỉ là câu hỏi thứ hai của tôi ở đây để xin lỗi nếu tôi không định dạng câu hỏi này một cách chính xác.Đọc JSON POST bằng cách sử dụng PHP

Tôi có một dịch vụ web thực sự đơn giản mà tôi đã tạo cần phải có giá trị bài và trả về một mảng được mã hóa JSON. Đó là tất cả làm việc tốt cho đến khi tôi đã nói với tôi sẽ cần phải gửi dữ liệu biểu mẫu với một loại nội dung của ứng dụng/json. Kể từ đó, tôi không thể trả lại bất kỳ giá trị nào từ dịch vụ web và đó chắc chắn là điều cần làm với cách tôi lọc các giá trị bài đăng của họ.

Về cơ bản trong thiết lập địa phương của tôi, tôi đã tạo ra một trang thử nghiệm nào sau đây -

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

Trên webservice Tôi đã này (tôi đã tước ra một số chức năng) -

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

?> 

Về cơ bản tôi biết rằng đó là do các giá trị $ _POST không được thiết lập nhưng tôi không thể tìm thấy những gì tôi cần phải đặt thay vì $ _POST. Tôi đã thử json_decode ($ _ POST), file_get_contents ("php: // input") và một số cách khác nhưng tôi đã chụp trong bóng tối một chút.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn, Steve

Cảm ơn Michael cho sự giúp đỡ, đó là một bước nhất định về phía trước bây giờ đã ít nhất có một repsonse khi tôi echo bài .... ngay cả khi nó là null

cập nhật 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)); 

cập nhật php trên trang đó dữ liệu được đưa lên -

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

print_r(json_encode($input)); 

Như tôi nói ít nhất tôi thấy một câu trả lời ngay bây giờ trước khi nó trả lại một trang trống

+0

Không chắc chắn những gì thất bại, nhưng IMHO, bước đầu tiên sẽ được toprint ra nội dung của $ _POST để xem những gì trong đó. Nếu dữ liệu ở đó, nó khá dễ dàng để đối phó với chúng. Nếu $ _POST trống, ít nhất bạn biết vấn đề ở đâu. – Sylverdrag

+0

Nó phù hợp với tôi! – jruzafa

Trả lời

112

Bạn có sản phẩm nào $_POST. Nếu máy chủ web của bạn muốn xem dữ liệu ở định dạng json, bạn cần phải đọc dữ liệu đầu vào thô và sau đó phân tích nó bằng giải mã JSON.

Bạn cần một cái gì đó như thế:

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

Ngoài ra bạn có sai mã để thử nghiệm JSON-truyền thông ...

CURLOPT_POSTFIELDS nói curl để mã hóa các thông số của bạn như application/x-www-form-urlencoded. Bạn cần chuỗi JSON ở đây.

CẬP NHẬT

mã php của bạn cho trang thử nghiệm nên như thế:

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

Cũng trên trang web dịch vụ của bạn, bạn nên loại bỏ một trong những dòng header('Content-type: application/json');. Nó phải được gọi chỉ một lần.

+0

Cảm ơn Michael, đó là một trợ giúp lớn, bạn có thể xem bản chỉnh sửa của tôi và xem liệu bạn có thể thấy bất kỳ điều gì khác gây ra sự cố của tôi không? –

+1

Tôi đã cập nhật câu trả lời của mình để hiển thị các lỗi chung của bạn. –

+0

Con người, điều này rất hữu ích! Mã số $ json = file_get_contents ('php: // input'); $ obj = json_decode ($ json); Làm việc một cách hoàn hảo – Cleversou

1

Xin chào đây là một đoạn trích từ một dự án cũ của tôi sử dụng curl để lấy thông tin ip từ một số dịch vụ cơ sở dữ liệu ip miễn phí trả lời định dạng json. Tôi nghĩ rằng nó có thể giúp bạn.

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

getUserLocation($ip_srv); 

Chức năng:

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

      } 

     } 
    } 
+0

Cảm ơn đoạn mã nhưng tôi cho rằng vấn đề của tôi nằm ở phía webservice/PHP hơn là mã CURL (mặc dù bạn có thể tự do nói với tôi bằng cách khác vì tôi không phải là 100%). Tôi nghĩ rằng đó là giá trị PHP $ _POST của tôi và liệu chúng có cần phải là json_encoded hay cái gì khác. –

+0

hmm thử thêm điều này vào curl_setopt curl ($ curl, CURLOPT_UPLOAD, 1); – Syd

0

bạn có thể đặt json của bạn trong một tham số và gửi nó thay vì đặt chỉ json của bạn trong tiêu đề:

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

ở phía bên dịch vụ mà bạn có thể nhận được chuỗi json của bạn như một tham số:

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

thì bạn có thể sử dụng dữ liệu được chuyển đổi làm đối tượng.

Các vấn đề liên quan