2013-09-25 14 views
51

Ich habe mich viel umgeschaut, bevor ich diese Frage gepostet habe, also entschuldige mich, wenn es auf einem anderen Post ist und dies ist nur meine zweite Frage hier also entschuldige mich, wenn ich diese Frage nicht richtig formatiere.JSON POST mit PHP lesen

Ich habe einen wirklich einfachen Webdienst, den ich erstellt habe, der post-Werte nehmen und ein JSON-codiertes Array zurückgeben muss. Das alles funktionierte gut, bis mir gesagt wurde, dass ich die Formulardaten mit einem Inhaltstyp der Anwendung/json posten müsste. Seit dem kann ich keine Werte mehr aus dem Webservice zurückgeben und es hat definitiv etwas damit zu tun, wie ich ihre Postwerte filtere.

Grundsätzlich in meinem lokalen Setup habe ich eine Testseite erstellt, die die folgenden -

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

Auf der webservice Ich habe dies (ich habe einige der Funktionen gezupft) -

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

?> 

Grundsätzlich weiß ich, dass es aufgrund der $ _POST-Werte nicht gesetzt ist, aber ich kann nicht finden, was ich anstelle von $ _POST setzen muss. Ich habe versucht, json_decode ($ _ POST), file_get_contents ("php: // Eingabe") und eine Reihe anderer Möglichkeiten, aber ich schoss im Dunkeln ein wenig.

Jede Hilfe würde sehr geschätzt werden.

Danke, Steve

Danke Michael für die Hilfe, dass ein bestimmter Schritt nach vorne war, habe ich wenigstens jetzt auf einen repsonse bekam, als ich die Post echo .... auch wenn es

aktualisiert null ist 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)); 

aktualisiert pHP auf der Seite, die die Daten geschrieben wird -

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

print_r(json_encode($input)); 

Wie ich zumindest sage, sehe ich eine Antwort jetzt, bevor es eine leere Seite zurückgab

+0

Nicht sicher, was der Fehler ist, aber IMHO, der erste Schritt wäre der Inhalt von $ _POST, um zu sehen, was drin ist. Wenn die Daten da sind, ist es ziemlich einfach, mit ihnen umzugehen. Wenn $ _POST leer ist, wissen Sie zumindest, wo das Problem liegt. – Sylverdrag

+0

Es funktioniert für mich! – jruzafa

Antwort

112

Sie haben leere $_POST. Wenn Ihr Webserver Daten im JSON-Format sehen möchte, müssen Sie die Roheingabe lesen und dann mit JSON dekodieren.

Sie brauchen etwas wie folgt aus:

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

Auch Sie haben falsche Code zum Testen JSON-Kommunikation ...

CURLOPT_POSTFIELDScurl Ihre Parameter wie application/x-www-form-urlencoded zu kodieren erzählt. Sie benötigen JSON-String hier.

UPDATE

Ihr PHP-Code für Testseite sollte so sein:

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

auch auf Ihrer Web-Service-Seite eine der Leitungen header('Content-type: application/json'); entfernen sollte. Es muss nur einmal aufgerufen werden.

+0

Danke, Michael, das war eine große Hilfe. Kannst du dir meinen Schnitt ansehen und sehen, ob du noch etwas anderes siehst, das mein Problem verursacht? –

+1

Ich aktualisierte meine Antwort, um Ihre allgemeinen Fehler zu zeigen. –

+0

Mann, das war so hilfreich! Der Code $ json = file_get_contents ('php: // Eingabe'); $ obj = json_decode ($ json); Arbeitete perfekt – Cleversou

1

Hallo, das ist ein Ausschnitt aus einem alten Projekt von mir, die Curl verwendet, um IP-Informationen von einigen kostenlosen IP-Datenbanken zu erhalten, die darauf antworten JSON-Format. Ich denke, es könnte dir helfen.

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

getUserLocation($ip_srv); 

Funktion:

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

Danke für das Code-Snippet, aber ich denke, mein Problem ist auf der Webservice/PHP-Seite und nicht auf dem CURL-Code (obwohl es mir freisteht, mir das anders zu sagen, da ich nicht zu 100% bin). Ich denke, es sind meine PHP $ _POST-Werte und ob sie json_encoded oder etwas anderes sein müssen. –

+0

hmm versuchen, dies zu Ihrem Curl hinzufügen curl_setopt ($ curl, CURLOPT_UPLOAD, 1); – Syd

0

Sie Ihre json in einem Parameter setzen und es statt setzen nur Ihr json in Header senden:

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

auf der Serviceseite Sie Ihre JSON-String als Parameter erhalten kann:

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

dann können Sie Ihre konvertierten Daten als Objekt verwenden.