Begegnung mit dem vorherigen Eintrag, der die Grundlagen einführte curl
es ist Zeit für fortgeschrittene Techniken und Tricks, die es wert sind, unseren Fähigkeiten hinzugefügt zu werden.
Ob Sie ein Entwickler, Tester oder einfach nur ein Curl-Benutzer sind, der die Arbeit mit der API vereinfacht – dieser Eintrag kann für Sie nützlich sein!
Übrigens muss ich Sie erwähnen: Julia Evans erstellt wunderbare, gezeichnete cheatsheets für verschiedene Netzwerkwerkzeuge, Terminal-Befehle (linux / unix), hat vor einiger Zeit einen solchen Download für curl
:
curl pic.twitter.com/1PZ28kJr09
– 🔎Julia Evans🔍 (@b0rk) January 26, 2019
Wenn Sie sie noch nicht kennen, achten Sie darauf, einen Blick darauf zu werfen wizardzines.com
Liste der Tricks:
- Antwort mit Serverheadern
- Die Curl-Dokumentation ist immer zur Hand
- Senden von Formularen aus dem Terminal
- Hochladen von Dateien über curl
- Hochladen einer Datei über curl
- Fortsetzen des Herunterladens einer Datei
- Mehrere Dateien gleichzeitig hochladen
- Herunterladen mehrerer Dateien basierend auf einer Liste von Links
- Zeigt den Fortschrittsbalken für den Download an
- Erstellen und Automatisieren von URLs
- Der Bonus-Trick besteht darin, Curl direkt aus dem Browser zu kopieren
Wenn wir eine GET-Anfrage an die API senden, verwenden Sie curl
im Grunde werden wir so etwas bekommen:
curl example.com
und als Antwort ist der HTML-Code dieser Seite
<!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { ...
Wir können jedoch die Option verwenden -i
oder --include
, um auch die Antwortheader des Servers zu erhalten
curl -i example.com
Ergebnis:
HTTP/1.1 200 OK Age: 557583 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Date: Thu, 16 Feb 2023 15:18:07 GMT Etag: "3147526947+ident" Expires: Thu, 23 Feb 2023 15:18:07 GMT Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Server: ECS (nyb/1D18) Vary: Accept-Encoding X-Cache: HIT Content-Length: 1256 <!doctype html> <html>
Es kann auch sein, dass wir nur an Überschriften interessiert sind und den Antworttext weglassen möchten, dann müssen wir die Option verwenden -I
(--head
) das heißt, der Modus “nur info”.
curl -I example.com
2. Die Curl-Dokumentation ist immer zur Hand
Die Online-Dokumentation von curl ist nicht mein Favorit. Ich werde ehrlich sagen, dass es mir nicht gut ansieht, glücklicherweise ist die Konsolenversion viel angenehmer und es gibt eine Option zur Auswahl
curl -h
– um kurze Hinweise zu den beliebtesten Curl-Optionen zu erhaltencurl -h all
– um alle Optionen mit kurzen Beschreibungen zu überprüfen
~$ curl -h Usage: curl [options...] <url> -d, --data <data> HTTP POST data -f, --fail Fail silently (no output at all) on HTTP errors -h, --help <category> Get help for commands -i, --include Include protocol response headers in the output -o, --output <file> Write to file instead of stdout -O, --remote-name Write output to a file named as the remote file -s, --silent Silent mode -T, --upload-file <file> Transfer local FILE to destination -u, --user <user:password> Server user and password -A, --user-agent <name> Send User-Agent <name> to server -v, --verbose Make the operation more talkative -V, --version Show version number and quit This is not the full help, this menu is stripped into categories. Use "--help category" to get an overview of all categories. For all options use the manual or "--help all".
3. Senden von Formularen vom Curlem-Terminal
Wenn Sie alle Optionen auflisten, werden Sie die Option definitiv bemerken -F, --form
– dies ist eine Option, mit der Sie ein Formular ausfüllen können, um eine Nachricht zu senden.
Angenommen, wir haben ein so einfaches Anmeldeformular:
<form action="/register" method="POST"> <input type="text" name="username"> <input type="email" name="email"> <input type="submit" value="Submit"> </form>
Um es zu testen, führen wir wahrscheinlich die folgende Abfrage aus, die das Verhalten der Schaltfläche Senden (submit) simulieren sollte:
curl -X POST example.com/register -H "Content-Type: application/x-www-form-urlencoded" -d "username=testUser&[email protected]"
Wir müssen nicht hinzufügen -H "Content-Type: application/x-www-form-urlencoded"
, weil es der Standardtitel ist.
Der angegebene Typ application/x-www-form-urlencoded
bedeutet, dass der Text der an den Server gesendeten HTTP-Anfrage eine lange ist query string dh Schlüssel = Wert-Paare mit einem getrennten kaufmännischen und-Zeichen (&).
Was sehen wir in jedem Fall in der Abfrage als: "username=testUser&[email protected]"
Okay, aber was ist, wenn ich es wirklich habe lang query string, oder ich möchte senden datei in der Anwendung mit curl?
Dann kehren wir zu den Optionen zurück -F
.
→ senden eines Formulars mit einer POST-Methode mit einem Flag -d
Curl
curl -X POST example.com/register -d "username=testUser&[email protected]"
→ senden eines Formulars mit einer POST-Methode mit einem Flag -F
Curl,
dann die Methode -X POST
ist optional:
curl example.com/register -F "username=testUser" -F "[email protected]"
Nach der Dokumentation des Formulars Typ application/x-www-form-urlencoded
dies ist nicht geeignet, wenn wir zum Beispiel binäre Daten laden möchten (nicht alphanumerische Daten.datei) oder einfach eine große payload. In diesem Fall müssen Sie den Typ verwenden multipart/form-data
Hier ist ein Beispiel für das Senden eines Formulars sofort mit dem Hochladen eines Bildes:
curl example.com/register -F "username=testUser" -F "[email protected]" -F "[email protected]"
und das bringt uns zum nächsten Punkt …
4. Hochladen von Dateien über curl
Wir können die lokale Datei per Befehl laden / laden curl
. Wir können eine Datei hinzufügen, die sich an der gleichen Stelle wie der curl-Befehl befindet, der Dateiname muss mit einem Symbol versehen sein @
.
Ich werde ein ähnliches Beispiel geben:
curl example.com/upload -F "[email protected]"
sie können jedoch auch alle Parameter explizit hinzufügen (POST-Methode und content type):
curl -X POST example.com/upload -H "Content-Type: multipart/form-data" -F "[email protected]"
5. Hochladen einer Datei über curl
Wir können eine Datei mit dem gleichen Namen wie die Quelldatei auf dem Server hochladen.
Parameter -O / --remote-name
es zeigt auf die (binäre) Quelldatei, wenn Sie sie also nicht übergeben, kann curl sie nicht laden und gibt einen Fehler zurück (und kann im besten Fall eine grundlegende GETa ausführen).
curl -O example.com/file.pdf
Lassen Sie uns zum Beispiel den Download mit den Konsolenwerkzeugen herunterladen:
curl -O https://wizardzines.com/networking-tools-poster.pdf
vs wenn du es vergessen hast -O
:
curl https://wizardzines.com/networking-tools-poster.pdf
Ein Beispiel, das Ihnen eine Datei mit dem Namen herunterlädt 000-adr-template.md:
~$ curl -O https://gist.githubusercontent.com/ritaly/1d15b6c96c6bae86597684864ba85e6e/raw/96bfc801ec386de1ae9b331f9e87d97f0e452384/000-adr-template.md % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 379 100 379 0 0 3131 0 --:--:-- --:--:-- --:--:-- 3828
% – Zeigt den Download-Status in Prozent an;
Total-zeigt den Download-Status in Bytes an (das zusätzliche M bedeutet in Megabyte);
Laden einer Datei über curl mit einem neuen Namen
Feine Mischung mit Option -o
das heißt, das Hochladen einer Datei unter einem anderen Namen als dem, unter dem sich die Datei auf dem Server befindet:
curl example.com/file.pdf -o new_file.pdf
6. Fortsetzen des Herunterladens einer Datei
Wenn wir aus irgendeinem Grund mit dem Herunterladen der Datei begonnen haben und eine Unterbrechung aufgetreten ist, können wir fortfahren
curl -C - -O example.com/file.pdf
7. Mehrere Dateien gleichzeitig hochladen
curl -O example.com/file1.pdf -O example.com/file2.pdf -O example.com/fileX.txt
8. Herunterladen mehrerer Dateien basierend auf einer Liste von Links
Mit mehreren Dateien, die wir hochladen möchten, können wir eine Beispieldatei mit Links erstellen und alles mit einem einzigen Befehl laden.
Angenommen, wir haben eine Datei myurls.txt
, die einen Verweis auf jede neue Zeile enthält
example.com/file1.pdf example.com/file2.pdf example.com/fileX.txt
Wir können die folgende Operation im Terminal ausführen:
xargs -n 1 curl -O < myurls.txt
9. Zeigt den Fortschrittsbalken für den Download an
Sie haben Hunderte von Downloads und möchten wissen, welche % heruntergeladen wurden? Oder ist Ihre Datei wirklich groß?
Kein Problem! Option -#
fügt einen Fortschrittsbalken hinzu
curl -# -O example.com/hugefile.pdf
zum Beispiel.
curl -# -O https://jvns.ca/wizard-zine.pdf
Und im Werbegeschenk haben Sie ein Supermagazin von Julia Evans zum Lesen.
Url globbing-Erstellen und Automatisieren des Abrufs von Curl ’em-URLs
Curl hat eine bestimmte Option, die auf die einfachsten Sanity-Tests und andere interessante Automatisierungen angewendet werden kann, von denen ich selbst ziemlich spät erfahren habe, dh nur Url globbing.
Wir brauchen einen Bereich von URLs, die im Grunde gleich sind -nur ein kleiner Teil davon ändert sich zwischen Anfragen. Ein Beispiel wäre beispielsweise die Überprüfung, dass alle URLs eines bestimmten Bereichs (numerischer Bereich, eine Reihe von Namen) auf der Seite 200 entsprechen, wir wissen, dass die Adressen fest sind und das Format haben example.com/[rok]/[miesiac]/posts
Um einen numerischen Bereich zu übergeben, müssen wir Folgendes verwenden eckige KlammernÜberprüfen Sie dieses Beispiel:
curl https://jsonplaceholder.typicode.com/posts/[1-5]
(je nachdem, welche Konsole Sie verwenden, können zusätzliche Klammern erforderlich sein []
. auf dem Mac habe ich dieses Problem nicht, aber unter Windows kann die Konsole einen Verweis auf einen umgekehrten Schrägstrich machen, oder Sie sollten Anführungszeichen verwenden)
curl https://jsonplaceholder.typicode.com/posts/[1-5] curl "https://jsonplaceholder.typicode.com/posts/[1-5]"
curl
fragt automatisch nach Endpunkten für Nachrichten 1 bis 5 ab.
Anstatt nach jeder 1 ID zu fragen, hindert Sie nichts daran, den Parameter “jeder Schritt” nach dem Doppelpunkt hinzuzufügen :
. Zum Beispiel möchten wir jeden dritten Beitrag überprüfen:
curl "https://jsonplaceholder.typicode.com/posts/[1-20:3]"
Wir können einen bestimmten Bereich übergeben, z. B. id = 3, 10, 25, 8, dafür verwenden wir geschweifte Klammern um eine Parameterliste zu übergeben.
Das Terminal markiert die Klammern als Sonderzeichen, sodass Sie sie anzeigen oder Anführungszeichen verwenden müssen
curl https://jsonplaceholder.typicode.com/posts/{3,10,25,8} curl "https://jsonplaceholder.typicode.com/posts/{3,10,25,8}"
Das Ergebnis dieser Abfrage können wir in einer Datei mit der Option Vergessen speichern -o
. außerdem können wir diese Speicherung automatisieren, so dass jedes Ergebnis eine eigene Ergebnisdatei erhält, die ausreicht, um eine Vorlage mit einem Symbol zu erstellen #1
. dieser Ort wird durch die folgenden Werte aus unserem Bereich ersetzt
curl https://jsonplaceholder.typicode.com/posts/{3,10,25,8} -o output#1.txt curl "https://jsonplaceholder.typicode.com/posts/{3,10,25,8}" -o output#1.txt
Wenn wir das zusätzlich mit der Fortschrittsleiste verbinden -#
, dann sehen wir, wie nachfolgende Anfragen geladen werden:
curl https://jsonplaceholder.typicode.com/posts/{3,10,25,8}/ -o output#1.txt -#
Wir können auch Dateien auf diese Weise hochladen
curl -O "http://example.com/img/[001-100].png"
ob numerische Bereiche mit einem alphabetischen Bereich oder einer Parameterliste kombiniert werden:
curl -O "http://example.com/{alfa,beta,gamma,delta}/[100-600:50]x[100-600:50].jpg"
Zurück zum ersten Beispiel: example.com/[rok]/[miesiac]/posts
wenn das Jahr im Format YYYY zwischen 2013-2023 und Monaten im Format mm liegt, reicht es aus:
curl -O "http://example.com/[2013-2023]/[01-12]"
BONUS: Wie kopiere ich eine HTTP-Anfrage aus dem Browser als curl
?
Ich habe es völlig vergessen, aber nachdem ich Julias Tweet zu Beginn eingefügt hatte, entschied ich, dass es sicherlich einen Trick wert war.
Wir können als Befehl kopieren curl
. jede HTTP-Anfrage, die in unserem Browser ausgeführt wird, ist Chrome / Firefox oder Safaria, obwohl ich glaube, dass auch andere Browser diese Möglichkeit ermöglichen.
- Öffnen DevTools Lesezeichen Netzwerk (“Netzwerk”, wenn Sie die polnische Version verwenden).
- Klicken Sie mit der rechten Maustaste (oder drücken Sie Strg) auf request.
- Tippen Sie auf Kopieren → Als cURL kopieren