Website-Suche

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 curl

Curl ist auch im "Core"-Archlinux-Repository verfügbar. Von dort aus können wir es installieren, indem wir Folgendes ausführen:

sudo pacman -Sy curl

Ausfü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.com

Wenn 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
85

Im 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-Parameter explizit auf application/json fest.
  • Ü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/post

Beachten 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!

Verwandte Artikel: