Tutorial zu den Grundlagen des Curl-Befehls mit Beispielen
Curl ist eine kostenlose Open-Source-Software, mit der wir Daten mit Servern austauschen können, die eines der vielen unterstützten Protokolle wie HTTP, HTTPS, FTP, FTP, SFTP verwenden. Da es sich bei Curl um ein Befehlszeilentool handelt, können wir es in unseren Skripten verwenden, um beispielsweise sich wiederholende Aufgaben zu automatisieren. Es gibt viele Anwendungsfälle, die Curl abdecken kann. In diesem Tutorial sehen wir jedoch einige der gebräuchlichsten.
In diesem Tutorial sehen wir, wie Sie Curl verwenden, um grundlegende GET- und POST-Anfragen auszuführen, und wie Sie die Header-Parameter einer Anfrage festlegen.
In diesem Tutorial lernen Sie:
- So installieren Sie Curl in einigen der am häufigsten verwendeten Linux-Distributionen
- So führen Sie GET- und POST-Anfragen mit Curl durch
- So senden Sie JSON- und XML-Daten in einer POST-Anfrage mit Curl
- So legen Sie die Parameter eines Anforderungsheaders mit Curl fest
Installation
Curl ist eine kostenlose Open-Source-Software, die auf github entwickelt wird. Es ist in den Repositories aller gängigen Linux-Distributionen enthalten, und die Chancen stehen gut, dass Sie feststellen werden, dass es bereits auf Ihrem System installiert ist. Sollten Sie es jedoch explizit installieren müssen, können Sie diesen Anweisungen folgen. So installieren Sie Curl auf Fedora:
sudo dnf install curl
Um das Paket auf Ubuntu, Debian und anderen Debian-basierten Distributionen zu installieren, können wir stattdessen den folgenden Befehl starten:
sudo apt-get update && sudo apt-get install curlCurl ist auch im "Core"-Archlinux-Repository verfügbar. Von dort aus können wir es installieren, indem wir Folgendes ausführen:
sudo pacman -Sy curlAusführen von GET-Anforderungen
Die GET-HTTP-Methode wird verwendet, um Ressourcen von einem Server abzurufen. Wenn wir eine Webseite über unseren Browser anfordern oder eine Datei herunterladen, verwenden wir diese Methode. Das Ausführen solcher Anfragen mit Curl ist ein sehr einfacher Vorgang. Im folgenden Beispiel fordern wir die https://www.google.com Seite an:
curl https://www.google.comWenn curl auf diese Weise aufgerufen wird, druckt es den Text der vom Server gesendeten Antwort in der Standardausgabe. In diesem Fall ist der Inhalt, den wir erhalten, der HTML-Code der Seite. Da der Inhalt über die Standardausgabe gesendet wird, können wir eine Pipe verwenden, um ihn als Eingabe in einen anderen Befehl einzuspeisen und ihn weiter zu verarbeiten und zu manipulieren. Hier ist ein triviales Beispiel. Angenommen, wir möchten zählen, wie oft das Wort "google" im Quellcode der Seite vorkommt, die von der Anfrage im vorherigen Beispiel zurückgegeben wurde:
curl -s https://www.google.com | grep -i -o google | wc -w
85Im obigen Beispiel haben wir Curl aufgerufen und die Option '-s' verwendet: Dies ist die Abkürzung für '–silent' und ändern das Curl-Verhalten so, dass der Fortschrittszähler für die Anforderung nicht angezeigt wird. Wie gesagt, der Text der Antwort wird an den Standard-Ausgabedateideskriptor gesendet, also verwenden wir den Umleitungsoperator | (ein Pipe), um ihn als Standardeingabe an grep zu übergeben, den wir mit der Option -i aufrufen, um die Groß- und Kleinschreibung nicht zu beachten, und mit -o, um nur den passenden Teil einer Zeile anzuzeigen (in diesem Fall wird nur die Welt "google" angezeigt, anstelle der ganzen Zeile, in der das Wort vorkommt). Schließlich senden wir die von grep erzeugte Ausgabe an den Befehl wc -w, der die Anzahl der Wörter zurückgibt.
Herunterladen einer Datei
Curl kann auch zum Herunterladen von Dateien verwendet werden. Da, wie gesagt, der Hauptteil einer Antwort in der Standardausgabe angezeigt wird, müssen wir angeben, dass wir sie als Datei in unserem Dateisystem speichern möchten, sonst würden wir Kauderwelsch in unserem Terminal sehen. In solchen Fällen können wir die Option -o (kurz für --output) verwenden und als Argument den Namen angeben, der für die lokale Datei verwendet werden soll. Angenommen, wir möchten die neueste Version von Firefox von der offiziellen Mozilla-Website herunterladen. Um den Tarball lokal als firefox.tar.bz2 zu speichern, führen wir den folgenden Befehl aus:
curl \
--output firefox.tar.gz \
https://download-installer.cdn.mozilla.net/pub/firefox/releases/106.0.1/linux-x86_64/en-US/firefox-106.0.1.tar.bz2
Eine wichtige Sache, die Sie beachten sollten, ist, dass wir die URL in Anführungszeichen gesetzt haben, um zu vermeiden, dass die Shell mögliche Sonderzeichen interpretiert. Sobald wir den Befehl starten, wird der Download-Fortschritt auf dem Bildschirm angezeigt:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 137 100 137 0 0 176 0 --:--:-- --:--:-- --:--:-- 176
87 75.1M 87 65.6M 0 0 1486k 0 0:00:51 0:00:45 0:00:06 1454k^C
Als Alternative zur Option --output können wir --remote-name oder -O verwenden. Dies führt dazu, dass die Datei unter ihrem Remote-Namen gespeichert wird, in diesem Fall firefox-106.0.1.tar.bz2:
curl \
--remote-name \
'https://download-installer.cdn.mozilla.net/pub/firefox/releases/106.0.1/linux-x86_64/en-US/firefox-106.0.1.tar.bz2'
Ausführen von POST-Anforderungen
Die POST-HTTP-Methode wird verwendet, um neue Ressourcen auf einem Server zu erstellen. Eine POST-Anfrage enthält in der Regel Daten, die auf unterschiedliche Weise gesendet werden können. Sehen wir uns einige Beispiele an.
Verwenden des Inhaltstyps application/x-www-form-urlencoded
Die einfachste Möglichkeit, Daten in eine POST-Anfrage mit Curl einzuschließen, besteht darin, die Option --data (-d) oder --data-urlencode zu verwenden. Die Daten, die wir senden, müssen urlencodiert (prozentcodiert) sein. Wenn wir ersteres verwenden, müssen wir es vorher kodieren; Wenn wir stattdessen Letzteres verwenden (verfügbar in neueren Versionen von Curl), werden die Daten automatisch für uns kodiert:
curl \
--data-urlencode "name=John Smith" \
--data-urlencode "age=30" \
https://httpbin.org/post
Wenn wir eine Anfrage wie die oben gezeigte ausführen, wird x-www-form-urlencoded automatisch im Anforderungsheader als Wert des Parameters Content-Type gesetzt. Im obigen Beispiel haben wir die Anfrage an die https://httpbin.org Site gesendet, die zum Testen von Anfragen verwendet werden kann. Der Server gibt eine Antwort zurück, die die in der Anfrage gesendeten Daten widerspiegelt:
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "30",
"name": "John Smith"
},
"headers": {
"Accept": "*/*",
"Content-Length": "22",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/7.82.0",
"X-Amzn-Trace-Id": "Root=1-6356ba6c-325eb51e69a7a95021ee6249"
},
"json": null,
"origin": "xxx.xxx.x.xx",
"url": "https://httpbin.org/post"
}
Senden von JSON- oder XML-Daten
In einigen Fällen müssen wir möglicherweise eine JSON-Zeichenfolge als Daten senden. In solchen Fällen müssen wir zwei Dinge tun:
- Legen Sie den
Content-Type-Header-Parameterexplizit aufapplication/jsonfest. - Übergeben Sie den JSON-String als Argument der Option
--data.
Hier ist ein Beispiel für eine solche Anforderung:
curl \
--header "Content-Type: application/json" \
--data '{"name": "John Smith", "age": 30 }' \
https://httpbin.org/post
Das gleiche Prinzip sollte angewendet werden, wenn wir XML-Daten senden möchten, zum Beispiel:
curl \
--header "Content-Type: text/xml" \
--data '<person><name>John Smith</name><age>30</age></person>' \
https://httpbin.org/post
Verwenden des Inhaltstyps "multipart/form-data"
Um eine POST-Anfrage zu stellen und Daten mit dem Inhaltstyp multipart/form-data einzuschließen, können wir Curl mit der Option --form (-F) ausführen. Dies ist es, was wir zum Beispiel verwenden möchten, wenn wir eine Datei hochladen müssen. Hier ist die gleiche Anforderung, die wir im vorherigen Beispiel gestellt haben, aber mit diesem Inhaltstyp ausgeführt wurde:
curl \
--form "name=John Smith" \
--form "age=30" \
https://httpbin.org/post
Und hier ist die entsprechende Antwort, die vom Server gesendet wird:
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "30",
"name": "John Smith"
},
"headers": {
"Accept": "*/*",
"Content-Length": "243",
"Content-Type": "multipart/form-data; boundary=------------------------e231a6560f5118bd",
"Host": "httpbin.org",
"User-Agent": "curl/7.82.0",
"X-Amzn-Trace-Id": "Root=1-6356c1d1-05e70c5919d0971a3bd299e6"
},
"json": null,
"origin": "xxx.xx.x.xx",
"url": "https://httpbin.org/post"
}
Angenommen, wir möchten im Rahmen der Anfrage ein Bild hochladen, das derzeit in unserem Arbeitsverzeichnis vorhanden ist und dem Feld "Profil" zugeordnet ist. Hier ist der Befehl, den wir ausführen würden:
curl \
--form "name=John Smith" \
--form "age=30" \
--form "profile=@pic.avif" \
https://httpbin.org/post
Wie Sie sehen können, haben wir das @-Symbol verwendet, gefolgt vom Pfad des Bildes, der absolut oder relativ sein kann. Der Server gibt diese Antwort zurück, wenn wir die Anfrage ausführen. Beachten Sie, dass sich die von uns hochgeladene Datei im Abschnitt "Dateien" der Antwort befindet, der mit dem entsprechenden Formularfeld verknüpft ist (ich habe die Notation [...] verwendet, um den sehr langen Wert der Einfachheit halber wegzulassen):
{
"args": {},
"data": "",
"files": {
"profile-picture": "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAADwAAAAhwCAYAAACQvstyAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9btVoqIu0g4pChOlkQFXHUKhShQqgVWnUwufRDaNKQpLg4Cq4FBz8Wqw4uzro6uAqC[...]"
},
"form": {
"age": "30",
"name": "John Smith"
},
"headers": {
"Accept": "*/*",
"Content-Length": "153871",
"Content-Type": "multipart/form-data; boundary=------------------------94b6dea0b7f448d5",
"Host": "httpbin.org",
"User-Agent": "curl/7.82.0",
"X-Amzn-Trace-Id": "Root=1-6356c368-2f39e19a67106e4141410178"
},
"json": null,
"origin": "xxx.xx.x.xx",
"url": "https://httpbin.org/post"
}
Senden des Inhalts einer Datei
Curl bietet eine spezielle Syntax, die wir verwenden können, um den Inhalt einer Datei abzurufen, anstatt die Datei hochzuladen. Nehmen wir zum Beispiel an, wir haben unseren Namen in der name.txt Datei in unserem aktuellen Arbeitsverzeichnis gespeichert. Um den Inhalt als Wert des Formularfeldes "name" zu übergeben, verwenden wir das Symbol < auf folgende Weise:
curl --form "name=<name.txt" https://httpbin.org/postBeachten Sie, dass der gesamte Inhalt der Datei mit dem Wert des Felds verwendet wird, einschließlich Zeilenumbruchzeichen.
Festlegen der Anforderungsheader
Header-Parameter werden verwendet, um zusätzliche Informationen in einer Anforderung bereitzustellen: Einige Beispiele sind Keep-Alive, mit dem gesteuert wird, wie lange eine Verbindung offen bleiben soll, oder User-Agent, mit dem der Anwendungstyp und das Betriebssystem identifiziert werden, oder Accept, mit dem angegeben wird, welche MIME-Typen vom Client akzeptiert werden. Um Header-Parameter mit Curl zu setzen, können wir die Option -H (kurz für --header) verwenden:
curl \
--header "Accept: text/xml" \
--header "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:105.0) Gecko/20100101 Firefox/105.0" \
https://httpbin.org/get
Übrigens, um den User-Agent einer Anfrage zu setzen, stellt Curl eine Verknüpfung über die Option --user-agent (-A) zur Verfügung:
curl --user-agent "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:105.0) Gecko/20100101 Firefox/105.0" https://httpbin.org/get
Schlüsse
In diesem Artikel sehen wir die grundlegende Verwendung von Curl. Wir haben gelernt, wie man Anfragen mit den gebräuchlichsten HTTP-Methoden ausführt: GET und POST. Wir haben gesehen, wie man eine Datei herunterlädt, wie man verschiedene Arten von Daten in einer POST-Anfrage sendet und wie man die Header-Parameter einer Anfrage setzen kann. Curl ist ein äußerst nützliches Werkzeug: Hier haben wir es gerade vorgestellt. Werfen Sie einen Blick in das Handbuch, Sie werden von seinen vielen Funktionen überrascht sein!
