Suche
Power Tools Woche

Wie man sich das RESTliche Leben mit cURL erleichtert

Jochen Mader
HTTP-Performance messen

Neben dem Abrufen von HTTP-Ressourcen wie HTML-Seiten oder Bildern lassen sich auch Performancedaten ermitteln. Genau das bewerkstelligt man mit dem nächsten Kommando:

curl -o /dev/null -s -w %{time_connect}:%{time_total} http://slashdot.org

Neu hinzugekommen sind dabei folgende Parameter:

  • -s: Silent Mode, unterdrückt die Ausgabe von Ladebalken und Zusatzinformationen
  • -w: Definiert, was ausgegeben werden soll. Die verfügbaren Variablen sind in der man-Page beschrieben. In diesem Fall werden der Zeitpunkt der Verbindung und die Laufzeit des Requests ausgegeben.

Viele einfache Szenarien oder Einzelmessungen lassen sich so bereits abbilden.

JMeter ist doch besser

cURL liefert viele Daten, wird aber wegen der großen Zahl an notwendigen Requests bei großen Seiten schnell unhandlich. Hier empfehle ich cURL eher für Einzelmessungen zu verwenden und für die Erzeugung eines richtigen Testszenarios dann auf JMeter zu wechseln.

cURL und REST

Neben den unzähligen Vorteilen von REST (allen voran: Es ist nicht SOAP) liegt für Entwickler wohl der wichtigste in der Einfachheit der Tools. Braucht man für SOAP entweder die komplette Pipeline vom WSDL zum Testclient (der dann vielleicht auch funktioniert …) oder zumindest ein schwergewichtiges UI, können REST(ful)-APIs komplett via cURL bedient werden. Dies erleichtert nicht nur den Einstieg, sondern ermöglicht es auch, umfangreiche Setup-Aktionen in simple Skripten zu verpacken (CouchDB ist hier ein gutes Beispiel).

Da REST auf den elementaren HTTP-Operation PUT/GET/POST/DELETE (alle Operationen finden sich in der HTTP-Dokumentation) aufbaut, muss ich jetzt erst mal zeigen, wie man diese verwendet. Tatsächlich waren alle bisherigen HTTP-Beispiele eine (praktische) Kurzform. Ausgeschrieben würden sie wie folgt aussehen:

curl -X GET http://127.0.0.1:8080

Per Default wird der Parameter -X auf die HTTP-GET-Aktion gesetzt. Nachdem wir dieses Detail nun kennen, sollte es kein Problem sein, auch PUT und DELETE zu verwenden. Bei POST wird’s wieder etwas interessanter. Das folgende Beispiel zeigt, wie ein JSON-Dokument in einer CouchDB-Instanz abgelegt wird.

curl --header "Content-Type:application/json" -X POST http://127.0.0.1:5984/testdb/ -d @test.json

Via –header lässt sich unter anderem der passende Content-Type festlegen, -d ist da schon etwas trickreicher. Die Notation im Beispiel veranlasst cURL, den Inhalt der Datei test.json hochzuladen. Genauso könnte man auch eine durch & getrennte Liste an Parametern übergeben, was einem FORM-Submit entsprechen würde:

-d "parameter1=wert1&parameter2=wert2"
cURL und Twitter

Zum Abschluss noch ein detaillierteres Beispiel: einen Tweet versenden. Das Skript in Listing 1 bekommt als Parameter den Benutzernamen, das Passwort und einen Tweet (dieser muss URL-kodiert sein). Der Reihe nach passiert Folgendes:

  • Authenticity-Token vom Server holen, per awk extrahieren und in der Variablen token ablegen
  • Den Token mit Username/Passwort legitimieren
  • Tweet versenden
  • Abmelden

Dabei werden die Parameter -b (Inhalt dieser Datei als Cookie an den Server schicken), -c (Cookies in diese Datei schreiben) und -L (zwingt cURL Redirects zu folgen) verwendet.

Listing 1

username=$1
password=$2
tweet=$3
read token 
Das Ende

cURL ist mächtig. Früher habe ich es nur für einzelne Skripte eingesetzt oder von Zeit zu Zeit eine Auswertung damit gemacht. Mittlerweile verwende ich es fast täglich. Besonders das Arbeiten mit CouchDB ist ein wahres Vergnügen. Das eigentliche Managementinterface (Futon) nutze ich so gut wie nie.

Auch die Entwicklung von REST-APIs wird deutlich einfacher, da man alles „mal schnell“ ausprobieren kann. Wer jetzt auf den Geschmack gekommen ist, sollte einfach die cURL-Man-Page öffnen und ein bisschen schmökern.

Jochen Mader ist Senior-Entwickler bei der Senacor Technologies AG, wo er sich derzeit hauptsächlich mit der Entwicklung Wicket-basierter Frontends beschäftigt.
Geschrieben von
Jochen Mader
Kommentare

Schreibe einen Kommentar

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