[PHP] REST API Client

Jo17

Cadet 3rd Year
Registriert
Feb. 2016
Beiträge
47
Hallo liebe CBler,
ich habe eine REST-Schnittstelle unter
Code:
http://127.0.0.1:8000/charts/1/
laufen und kann diese unter JavaSript ansprechen und auch im Terminal mit
Code:
curl -X GET http://127.0.0.1:8000/charts/1/
. Dort bekomme ich die Antwort im JSON Format zurück wie gewünscht.

Nun ist mein Problem, dass mein PHP Client mit CURL nicht funktionieren will und ich nicht mehr weiter weiß. WebDevelopment ist überhaupt nicht mein Fachgebiet.

PHP-Version: PHP 7.4.14
Apache-Webserver
Fedora 32

Mein PHP-Code:
PHP:
<?php
$service_url = 'http://127.0.0.1:8000/charts/1/';
$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $service_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$curl_response = curl_exec($curl);

if ($curl_response === false) {
    $info = curl_getinfo($curl);
    curl_close($curl);
    echo 'error occured during curl exec. Additioanl info: ' . var_export($info);
}

?>

Dieser Code gibt auf der Webseite folgendes aus:
Code:
array ( 'url' => 'http://127.0.0.1:8000/charts/1/', 'content_type' => NULL, 'http_code' => 0, 'header_size' => 0, 'request_size' => 0, 'filetime' => -1, 'ssl_verify_result' => 0, 'redirect_count' => 0, 'total_time' => 0.0, 'namelookup_time' => 3.4E-5, 'connect_time' => 0.0, 'pretransfer_time' => 0.0, 'size_upload' => 0.0, 'size_download' => 0.0, 'speed_download' => 0.0, 'speed_upload' => 0.0, 'download_content_length' => -1.0, 'upload_content_length' => -1.0, 'starttransfer_time' => 0.0, 'redirect_time' => 0.0, 'redirect_url' => '', 'primary_ip' => '', 'certinfo' => array ( ), 'primary_port' => 0, 'local_ip' => '', 'local_port' => 0, 'http_version' => 0, 'protocol' => 0, 'ssl_verifyresult' => 0, 'scheme' => '', 'appconnect_time_us' => 0, 'connect_time_us' => 0, 'namelookup_time_us' => 34, 'pretransfer_time_us' => 0, 'redirect_time_us' => 0, 'starttransfer_time_us' => 0, 'total_time_us' => 0, )error occured during curl exec. Additioanl info:

Wenn noch was fehlt bitte einfach nachfragen, ich kenne mich mit PHP leider null aus und habe schon sehr lange nach einer Lösung gesucht, vielleicht könnt ihr mir helfen?

Einen schönen Samstag
Grüße

Edit: Ich bekomme auch keine Meldung von der REST Schnittstelle, dass eine Anfrage eingegangen ist...
 
Lösung
Also ich habe es heute endlich geschafft auszuprobieren und es hat nur unter Fedora Apache PHP nicht funktioniert weil
Code:
getsebool httpd_can_network_connect
OFF war.

Also mit
Code:
setsebool -P httpd_can_network_connect on
einfach anschalten und es geht.

Danke für eure Hilfe. 🙂👍💪
Da er ja in den unteren Block rennt, ist $curl_response false, es kommt also beim Aufruf von curl_exec() nichts zurück.

Hast du PHP so konfiguriert, dass es Fehler anzeigt? Ansonsten mal in die error_log vom Apache schauen, da könnte stehen was Curl für ein Problem hat.
 
Danke erstmal für eure Antworten.

Also curl_error() hatte ich schon ausprobiert und der gibt einen leeren String zurück -> laut Dokumentation kein Error.

Auch in den Logs steht leider nichts... zu CURL PHP.
 
PHP:
$error = curl_error($curl);

if($error === ''){
    echo "<br> No Error <br>";
}

echo "ErrorNr: " . curl_errno($curl) . "<br>";

Gibt folgendes aus:
No Error
ErrorNr: 7

Also CURLE_COULDNT_CONNECT
Ergänzung ()

Jetzt ist die Frage warum kann er nicht connecten. Da es doch über die Kommandozeile geht...

Meine CURL-Version laut php "curl_version" ist 7.69.1.
 
Zuletzt bearbeitet:
Setz noch ein paar debug curlopts. Denke curlopt_verbose und _failonerror sowie _followlocation sollten Aufschluss geben- besonders letzteres, da der Uri keine Datei angibt und ein implizites Location: zu erwarten ist.
 
Könnte mir vorstellen, dass es ein Permission-Problem ist. Kannst folgendes mal testen, einfach bei den setopts mit hinzufügen:

PHP:
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
 
Also ich habe es heute endlich geschafft auszuprobieren und es hat nur unter Fedora Apache PHP nicht funktioniert weil
Code:
getsebool httpd_can_network_connect
OFF war.

Also mit
Code:
setsebool -P httpd_can_network_connect on
einfach anschalten und es geht.

Danke für eure Hilfe. 🙂👍💪
 
Zurück
Oben