webentwicklung-frage-antwort-db.com.de

JSON lesen POST mit PHP

Ich habe mich viel umgesehen, bevor ich diese Frage gepostet habe. Ich entschuldige mich, wenn es sich um einen anderen Beitrag handelt. Dies ist nur meine zweite Frage. Ich entschuldige mich, wenn ich diese Frage nicht richtig formatiere.

Ich habe einen wirklich einfachen Webdienst, den ich erstellt habe, der Postwerte annehmen und ein JSON-codiertes Array zurückgeben muss. Das hat gut funktioniert, bis mir gesagt wurde, ich müsste die Formulardaten mit einem Content-Type von application/json veröffentlichen. Seitdem kann ich keine Werte vom Webservice zurückgeben. Dies hat definitiv etwas damit zu tun, wie ich ihre Postwerte filtern kann.

Grundsätzlich habe ich in meinem lokalen Setup eine Testseite erstellt, die folgende Aufgaben hat:

$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 dem Webservice habe ich das (ich habe einige Funktionen ausgezogen) -

<?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 daran liegt, dass die $ _POST-Werte nicht festgelegt sind, aber ich kann nicht finden, was ich anstelle des $ _POST-Befehls setzen muss. Ich habe Json_decode ($ _ POST), file_get_contents ("php: // input") und eine Reihe anderer Möglichkeiten ausprobiert, aber ich habe etwas im Dunkeln gedreht.

Jede Hilfe wäre sehr dankbar.

Danke, Steve

Danke Michael für die Hilfe, das war ein definitiver Schritt nach vorne. Ich habe jetzt zumindest eine Repsonse erhalten, wenn ich den Beitrag wiederhole .... auch wenn er null ist 

aktualisierte 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 auf der Seite aktualisiert, auf die die Daten gepostet werden -

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

print_r(json_encode($input));

Da ich zumindest sage, sehe ich jetzt eine Antwort, bei der zuvor eine leere Seite zurückgegeben wurde

53
Steve Matthews

Sie haben keinen $_POST. Wenn Ihr Webserver Daten im Json-Format anzeigen möchte, müssen Sie die Rohdaten lesen und diese anschließend mit JSON-Dekodierung analysieren.

Sie brauchen so etwas:

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

Sie haben auch einen falschen Code zum Testen der JSON-Kommunikation ...

CURLOPT_POSTFIELDS weist curl an, Ihre Parameter als application/x-www-form-urlencoded zu kodieren. Sie benötigen hier einen JSON-String.

UPDATE

Ihr PHP-Code für die Testseite sollte folgendermaßen aussehen:

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

Auf Ihrer Web-Service-Seite sollten Sie auch eine der Zeilen header('Content-type: application/json'); entfernen. Es muss nur einmal aufgerufen werden.

120

Hallo, dies ist ein Ausschnitt aus einem alten Projekt von mir, das curl verwendet, um IP-Informationen von einigen kostenlosen IP-Datenbankdiensten abzurufen, die im Json-Format antworten. 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);

            } 

        }
    }
1
Syd

sie können Ihren Json in einen Parameter setzen und ihn senden, anstatt nur Ihren Json in den Header zu setzen:

$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 können Sie Ihren Json-String als Parameter erhalten:

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

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

0