PHP cURL – Eine kurze Einführung

Veröffentlicht von Bastian - 3. Mai 2019

cURL ist eines der wichtigens Tools für Entwickler. Durch den Einsatz von cURL ist es möglich Daten aus unterschiedlichen Quellen abzufragen. Die unterschiedlichen Möglichkeiten dabei sind nahezu unzählbar. Das klassische Einstiegsbeispiel ist dabei die Abfrage von Daten aus einer Schnittstellen. Um jedoch Daten per cURL abfragen zu können müssen zunächst einzelne Schritte beachtet und durchlaufen

curl

Aufbau eines cURL Requests

Der Aufbau eines cURL Requests setzt sich dabei zunächst auf 5 Schritten zusammen.

  1. cURL-Session initialisieren
  2. Option(en) für einen cURL Transfer setzen
  3.  cURL-Session ausführen
  4.  cURL-Session schließen
  5. Ausgabe / Verwendung der Ergebnisse
<?php
//step1
$curl_session = curl_init(); 
//step2
curl_setopt($curl_session ,CURLOPT_URL,"http://www.example.com");
//step3
$result = curl_exec($curl_session );
//step4
curl_close($curl_session );
//step5
echo $result;
?>

In diesem Beispiel wird eine einfache Session mit curl_init gestartet. Anschließend wird über curl_setopt die Option CURLOPT_URL gesetzt und dabei die gewünschte Ziel URL angegeben. Anschließend wird die Session mit curl_exec ausgeführt und mit curl_close geschlossen. Das Ergebnis wird dabei in der Variable $result gespeichert und kann anschließend ausgegeben werden. Dieser einfache Aufbau ruft dabei die angegeben URL auf und gibt die dabei erhaltenen Inhalte, in diesem Fall die Webseite www.example.com, aus. Der dabei vermutlich wichtigste und interessante Teil ist curl_setopt. Hierbei gibt es sehr viele aber vor allem auch sehr unterschiedliche Möglichkeiten den Request anzupassen. Eine Liste der unterschiedlichen Optionen gibt es in der PHP cURL Dokumentation Um nun aber nicht nur eine einzelne Webseite abfragen und ausgeben zu können wollen wir nun den Request anpassen. Der Ablauf (5 Schritte) bleibt dabei der gleiche. Interessant wird dies vor allem dann, wenn die Abgefragte URL nicht nur eine einfache Webseite sondern eine tatsächliche Schnittstelle ist.

Abfrage von Daten einer Schnittstelle mit GET Parametern

<?php
$fields = http_build_query(array(
	"count" => "1",
	"gender" => "m",
	"minAge" => "18",
	"maxAge" => "23",
  "format" => "json"
));
$curl_session = curl_init(); 
curl_setopt($curl_session ,CURLOPT_URL, "https://randomname.de/?" . $fields);
curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($curl_session );
curl_close($curl_session );
echo $result;
?>

In diesem Beispiel fragen wir bei einer Schnittstelle gezielt nach einer imaginären, zufällig generierten Person. Dabei wollen wir aber auch einige der Merkmale genauer definieren. Diese Merkmale übergeben wir der Schnittstelle in Form von GET Parametern welche mir an die URL anhängen. In diesem Falle wollen wir eine männliche Person im Alter zwischen 18 und 23 im Format JSON generieren und als Antwort erhalten. Zusätzlich setzten wir CURLOPT_RETURNTRANSFER auf TRUE um das Ergebnis in einer Variable abzuspeichern und anschließend ausgeben zu können.

Abfrage von Daten mit Authentifizierungen per POST

In den bisherigen Beispielen haben wir Requests an Schnittstellen betrachtet bei denen die GET Methode zum Einsatz kommt. Nun wollen wir aber Parameter im Hintergrund an eine Schnittstelle schicken. Unterschied GET und POST Dafür nutzen wir wieder einen ähnlichen Aufbau für unseren Request wie bisher. Passen allerdings dazu nochmals unsere Optionen an. In diesem Fall schauen wir uns den Aufbau an einem Imaginären Request an.

<?php
$fields = http_build_query(array(
  "id" => "007",
));
$curl_session = curl_init(); 
curl_setopt($curl_session ,CURLOPT_URL, "https://www.someurl.de/request/getuser/byid/");
curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl_session, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl_session, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl_session, CURLOPT_POSTFIELDS, $fields);
curl_setopt($curl_session, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Authorization: OAuth SomeOAuthaccess')
);

$result = curl_exec($curl_session );
curl_close($curl_session );
print_r($result);
?>

Zunächst fällt auf, dass wir deutlich mehr Optionen gesetzt haben als zuvor. Dies liegt unter anderem daran, dass wir nun nicht mehr per GET sondern per POST unsere Daten an die Schnittstelle senden möchten, zusätzlich wird auch noch ein Content-Type (application/json), sowie eine Authorization (OAuth SomeOAuthaccess) mitgesendet. Welche Optionen dabei genau gesetzt werden und warum aber auch in was für einem realen Beispiel ein solches Requests Verwendung finden könnte wollen wir uns nun genauer anschauen.

Ablauf des Requests

Zunächst wird ein einzelner Parameter definiert, in diesem Beispiel soll dieser eine User ID darstellen. Direkt im Anschluss wird nun, wie bisher, die URL definiert. In diesem Falle handelt es sich um eine fiktive URL die das Beispiel unterstützen soll. Die URL lautet https://www.someurl.de/request/getuser/userid/. Anhand der Bezeichnung der einzelnen Teile der URL lässt sich schon darauf schließen was dieser Service anbieten könnte. Die URL soll dabei beispielsweise eine REST Api darstellen an welcher die Daten eines Users anhand der userid abgefragt werden können. Anschließend definieren wir wieder CURLOPT_RETURNTRANSFER um das Ergebnis abspeichern zu können ohne das dieses direkt ausgegeben wird. Nun definiteren wir mit CURLOPT_CUSTOMREQUEST die Art des Requests, welche in diesem Falle POST und nicht mehr GET sein soll. Anschließend übergeben wir unsere Parameter die dabei übertragen werden sollen und setzten anschließend das Format. Neu ist dabei nun die Authorization hierbei soll im Beispiel verdeutlicht werden wie eine Authentifizierung mit angehängt werden kann. In diesem Falle eine Authentifizierung mit OAuth und einem Key SomeOAuthaccess. Neben OAuth gibt es weitere Authentifizierungen wie Basic oder Token. Anschließend führen wir den Requests aus, speichern das Ergebnis in einer Variablen, schließend die Session und geben das Ergebnis aus. In diesem Falle könnten dies nun die Daten eines Users in einem Format wie JSON oder XML sein. Mehr Informationen zu den Möglichkeiten der einzelnen Optionen gibt es in der curl_setopt Dokumentation

Weitere interessante und lustige Schnittstellen

Viele Webseiten bieten ganz unterschiedliche Schnittstellen an. Manche davon sind sehr nützlich wie z.B. eine Abfrage die Werte Longitude und Latitude einer Stadt anzufragen. http://www.zippopotam.us/ http://api.zippopotam.us/de/78467 Manche davon bieten eher lustige Funktionen an wie z.B. ein zufälliges Kanye West Zitat https://kanye.rest/ https://api.kanye.rest/ Eine Ganze Liste von Schnittstellen gibt es auf GitHub https://github.com/toddmotto/public-apis vom User toddmotto

Weitere Interessante Links zum Thema:

PHP.net Manuel cURL Video: PHP cURL Tutorial and Example Video: How to post data using curl in php Weitere Artikel des Autors

Das könnte Dich auch interessieren

Die Zukunft des Journalismus liegt im Lokalen.

Wir beim SÜDKURIER erfinden den Lokaljournalismus neu. Als Organisation mit 700 Mitarbeitern und 16 Redaktionen haben wir beschlossen, diesen Pfad einzuschlage...

In 4 Schritten zum erfolgreichen Projekt

Viele große Projekte starten mit einer einfachen Idee. Die Idee wird auf ihre Einzigartigkeit und Umsetzbarkeit geprüft und eventuell umgesetzt. Was ist bei d...

Speedforce – Pt. II: Performance Analyse

Was bisher geschah: In der letzten Folge haben wir einen Überblick bekommen, was hinter dem Begriff "Performance" eigentlich steckt. Nun wollen wir uns angucke...