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