Power Tools Woche

Wie man sich das RESTliche Leben mit cURL erleichtert

Jochen Mader

Was wäre ein Entwickler ohne seine Tools? Die nützlichen kleinen Helferlein erleichtern unser Leben von Tag zu Tag, ersparen uns Zeit und Aufwand. Und weil Tools so nützlich sind, möchten wir Ihnen in unserer Power Tools Woche jeden Tag ein anderes vorstellen. An Tag 2 geht es weiter mit cURL.

cURL ist ein vielseitiges Tool, das den Umgang (nicht nur) mit HTTP deutlich erleichtert. Neben der Automatisierung alltäglicher Aufgaben ist vor allem der Umgang mit RESTful-Anwendungen eines seiner herausragenden Merkmale.

Gerade in einer GUI-verwöhnten Welt ist es immer wieder ein großes Vergnügen, eine Shell in Anwesenheit Unwissender zu öffnen. Anerkennende Blicke sind einem sicher, wenn man mit grüner Schrift auf schwarzem Grund per cat die Einkaufsliste für morgen füllt. Man spürt förmlich die Erwartung des Zuschauers, dem Knacken einer 256-Bit-AES-Verschlüsselung in unter zehn Sekunden beizuwohnen.

Abseits der Mythen sind die Shell und ihre Tools eines der wichtigsten Werkzeuge erfahrener Entwickler. Gestrandet auf einem vom Kunden gestellten Rechner ohne grep, awk und sed kann man beobachten, wie sich nervöse Zuckungen über den geplagten Entwicklerkörper ausbreiten.

Abseits dieses klassischen Trios gibt es aber noch eine Vielzahl weiterer Tools, die oft unbeachtet ihr Dasein auf der Platte fristen. Wer sie kennt oder zumindest weiß, wo er nach ihnen suchen muss, kann sich den Alltag deutlich vereinfachen. Eines möchte ich in diesem Artikel vorstellen, hat es mir doch sowohl im täglichen Arbeiten als auch beim Spielen mit REST mein Leben deutlich erleichtert.

Enter cURL

Die Rede ist natürlich von „Client for URLs“ (kurz cURL). Das Tool und die zugehörige libcurl sind eine Art Schweizer Offiziersmesser der Application-Layer-Protokolle: HTTP, HTTPS, FTP, SFTP, TFTP, TELNET, LDAP, SMTP und noch einige mehr werden beinahe vollständig unterstützt. Sie alle werden über eine einheitliche Schnittstelle angesteuert. Dies erleichtert den Umgang mit ihnen und schafft viel Spielraum für einfache Automatisierungen. Bis heute habe ich hier keine Funktion vermisst, wobei ich zugeben muss, dass ich im Alltag beinahe ausschließlich HTTP/HTTPS, SMTP und SFTP/FTP verwende. Ein schnelles Beispiel, um das Eis zu brechen:

curl smtp://smtp.gmail.com --ssl -u user@gmail.com:passwort --mail-from '' --mail-rcpt '' -T hello.txt

Wer schon immer mal via Gmail eine Mail von der Kommandozeile aus versenden wollte kann dies mit dem gerade gezeigten Code tun. Drei der Parameter sind für uns dabei besonders interessant, da sie auch für die anderen Protokoll-Varianten verwendet werden:

  • –ssl: SSL für die Übertragung verwenden
  • -u: Username/Passwort-Kombination für die Verbindung
  • -T: Name der Datei, die übertragen werden soll
cURL und FTP

Etwas interessanter wird es bei einem Protokoll, das mehr als nur das Versenden einer Datei beherrscht. Der Download einer Datei via FTP ist ein schon fast triviales Vorhaben:

curl ftp://ftp.halifax.rwth-aachen.de/ubuntu-releases/12.04//ubuntu-12.04-desktop-i386.iso -o ubuntu.iso

Das einzig Erklärenswerte in diesem Befehl ist der Parameter -o. Er wird benötigt, weil grundsätzlich alle vom Server empfangenen Daten erst mal direkt auf Standard-Out landen. Mit dem Parameter lässt sich der Rückgabewert, in unserem Fall das aktuelle Ubuntu-ISO, in die angegebene Datei umleiten. Mit einem Blick auf das SMTP-Beispiel von eben kann man sich die Uploadvariante vielleicht schon selbst zusammenreimen:

curl ftp://my.ftp.server/super/secret -T secretanswer.txt -u username:password
cURL und HTTP

Auch wenn FTP und SMTP interessant sind und man hier und da Verwendung für die gezeigten Beispiele findet, stellt doch HTTP das für uns Entwickler weitaus wichtigere Protokoll dar. Fangen wir mit der einfachsten Variante an, dem Abholen einer Seite:

curl http://127.0.0.1:8080

Das Gleiche mit HTTPS:

curl https://127.0.0.1:8443

Und wenn’s mit selbstsignierten Zertifikaten funktionieren soll, fügt man noch -k hinzu (sonst wird man von cURL vehement auf das ungültige Zertifikat hingewiesen):

curl -k https://127.0.0.1:8443

Auch die Authentifizierung mit Zertifikaten ist ein Kinderspiel:

curl --cert mycert.pem https://secure.example.com
Wicket

Um die cURL-Beispiele direkt ausprobieren zu können, empfehle ich den Wicket-Quickstart:

mvn archetype:generate -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.5.7 -DgroupId=com.mycompany -DartifactId=myproject -DarchetypeRepository=https://repository.apache.org/ -DinteractiveMode=false

Im so erzeugten Projekt dann noch mvn jetty:run aufrufen und loslegen.

Überlegen wir jetzt mal, wie viel Arbeit es kostet, diese einfachen Aktionen mit Apache HttpComponents umzusetzen. (Nicht falsch verstehen: Das ist eine großartige Bibliothek, die mir schon viel Arbeit erspart hat.) Wahrscheinlich dauert das Starten der JVM länger als die Eingabe des cURL-Kommandos.

Geschrieben von
Jochen Mader
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.