2013-09-25 18 views
51

Mi sono guardato intorno prima di postare questa domanda, quindi mi scuso se si trova su un altro post e questo è solo il mio secondo quesiton qui, quindi scusami se non formatto correttamente questa domanda.Leggere il POST JSON usando il PHP

Ho un servizio Web davvero semplice che ho creato che ha bisogno di prendere valori di post e restituire un array con codifica JSON. Tutto ha funzionato fino a quando non mi è stato detto che avrei dovuto pubblicare i dati del modulo con un tipo di applicazione/json del contenuto. Da allora non posso restituire alcun valore dal servizio web ed è sicuramente qualcosa a che fare con il modo in cui sto filtrando i loro valori di post.

Fondamentalmente nel mio setup locale ho creato una pagina di test che fa la seguente -

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

Sulla webservice che ho questo (ho messo a nudo alcune delle funzioni) -

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

?> 

Fondamentalmente so che è dovuto ai valori $ _POST non impostati, ma non riesco a trovare quello che devo mettere al posto di $ _POST. Ho provato json_decode ($ _ POST), file_get_contents ("php: // input") e un certo numero di altri modi, ma stavo sparando al buio un po '.

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie, Steve

Grazie Michael per l'aiuto, che è stato un passo avanti ora hanno almeno ottenuto un repsonse quando mi associo il post .... anche se è nullo

aggiornato 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 aggiornato sulla pagina che i dati viene registrato -

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

print_r(json_encode($input)); 

Come ho detto almeno vedo una risposta ora dove prima stava restituendo una pagina vuota

+0

Non sono sicuro di quale sia l'errore, ma IMHO, il primo passo sarebbe la stampa del contenuto di $ _POST per vedere cosa c'è dentro. Se i dati ci sono, è abbastanza facile gestirli. Se $ _POST è vuoto, almeno sai dove si trova il problema. – Sylverdrag

+0

Funziona per me! – jruzafa

risposta

112

Hai vuota $_POST. Se il tuo server web vuole vedere i dati in formato json, devi leggere l'input non elaborato e quindi analizzarlo con la decodifica JSON.

Hai bisogno di qualcosa di simile:

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

Inoltre si ha un codice errato per il test JSON-comunicazione ...

CURLOPT_POSTFIELDS dice curl per codificare i parametri come application/x-www-form-urlencoded. Hai bisogno di JSON-string qui.

UPDATE

codice PHP per la pagina di test deve essere così:

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

anche sulla tua pagina web-servizio che si dovrebbe rimuovere una delle linee header('Content-type: application/json');. Deve essere chiamato solo una volta.

+0

Grazie Michael, è stato un grande aiuto, puoi dare un'occhiata alla mia modifica e vedere se riesci a vedere qualcos'altro che sta causando il mio problema? –

+1

Ho aggiornato la mia risposta per mostrare i vostri errori generali. –

+0

Uomo, questo è stato molto utile! Il codice $ json = file_get_contents ('php: // input'); $ obj = json_decode ($ json); Ha funzionato perfettamente – Cleversou

1

Ciao questo è uno snippet da un mio vecchio progetto che usa arricciatura per ottenere informazioni ip da alcuni servizi di database ip gratuiti che rispondono in formato json. Penso che potrebbe aiutarti.

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

getUserLocation($ip_srv); 

Funzione:

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

Grazie per lo snippet di codice, ma penso che il mio problema sia sul lato webservice/PHP piuttosto che sul codice CURL (anche se sentitevi liberi di dirmi altrimenti perché non sono al 100%). Penso che siano i miei valori PHP $ _POST e se debbano essere json_encoded o qualcos'altro. –

+0

hmm prova ad aggiungere questo al tuo curl_setopt ($ curl, CURLOPT_UPLOAD, 1); – Syd

0

si può mettere il JSON in un parametro e inviarlo, invece di mettere solo il tuo JSON nell'intestazione:

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

sul lato del servizio è possibile ottenere la stringa JSON come parametro:

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

quindi è possibile utilizzare i dati convertiti come oggetto.

Problemi correlati