Kommandozeilen-Client für das API-Zeitalter HTTPie mit OpenAPI

Autor / Redakteur: Mirco Lang / Stephan Augsten

HTTPie ist ein Helferlein für alle API-Entwickler und -Nutzer, das dem bekannteren cURL aktuell heftig Konkurrenz macht. Vor allem im OpenAPI-Bereich funktioniert der CLI-Client sehr gut.

Der CLI-Client HTTPie bietet einige nützliche Funktionen für den Aufruf und das Debugging von APIs, HTTP-Servern und Web-Diensten.
Der CLI-Client HTTPie bietet einige nützliche Funktionen für den Aufruf und das Debugging von APIs, HTTP-Servern und Web-Diensten.
(Bild: HTTPie)

HTTPie bezeichnet sich selbst als „nutzerfreundlichen Kommandozeilen-Client für die API-Ära“ – und trifft damit genau den Punkt: Wo man hinschaut, bieten Webdienste auch offene Schnittstellen an. Über die APIs lassen sich Produkte oft besser und vor allem individueller nutzen – und auch eigene Clients sind verhältnismäßig einfach zu realisieren.

Für die Nutzung von Web-APIs und noch mehr für Tests greift man dann häufig zu cURL, um passende HTTP-Requests zu formulieren. Die Syntax dabei ist lang und teils recht umständlich, Antworten sind blasser Buchstabensalat. Für gelegentliche Nutzer gibt es daher seit jeher Webdienste, die sich auf solche Requests spezialisiert haben und eine einfache Alternative zu cURL bieten, beispielsweise ReqBin.

Ernsthaftes Arbeiten ist damit auf Dauer aber nicht möglich und da tritt das Open-Source-Tool HTTPie auf den Plan. Der HTTP- und HTTPS-Client bietet eine einfachere Syntax für Abfragen, unterstützt standardmäßig JSON, liefert Ausgaben mit Syntax-Highlighting, kann mit Formularen umgehen und Downloads wie von wget bekannt durchführen.

Das vielleicht spannendste Feature: HTTPie beherrscht Sessions, um beispielsweise Authentifizierungen nicht bei jeder einzelnen Anfrage übergeben zu müssen – die Identifizierung bleibt dann persistent über mehrere Anfragen erhalten. Noch eine Schippe drauf legt HTTP-Prompt, das auf HTTPie aufbaut.

HTTP-Prompt bietet Syntax-Highlighting direkt in der Eingabe, Auto-Komplettierung und eine OpenAPI-/Swagger-Integration, mit der sich Endpoints schlicht wie Dateien im normalen Linux-Dateisystem durchforsten lassen, einfach per ls-Kommando. Zudem kann hier abermals Tipparbeit eingespart werden, denn Nutzer erhalten dem Namen entsprechend einen eigenen Prompt – mit der URL des gewünschten Servers statt eines lokalen Ordners. So dürfen sie bei Anfragen auf den URL-Part verzichten.

HTTPie im Einsatz

Die Installation von HTTPie ist trivial und erfolgt über den Paketmanager der genutzten Linux-Distribution („apt install httpie“ oder entsprechend) oder universell, auch unter Windows, per pip-Verfahren:

python -m pip install --upgrade pip setuptools
python -m pip install --upgrade httpie

Anschließend stehen die Kommandos „http“ und „https“ zur Verfügung. Für einen ersten Test eignet sich der folgende Befehl:

http PUT pie.dev/put name=peter

Mit pie.dev existiert ein simpler HTTP-Request und -Response-Service zum Testen. Das Ergebnis ist eine formatierte, kolorisierte Ausgabe von Response-Header und -Body. Die Ausgabe lässt sich jedoch auch erweitern beziehungsweise einschränken, etwa mit:

http --print=HBhb PUT pie.dev/put name=peter

HTTPie-Ausgabe, beschränkt auf Anfrage-Header und -Body.
HTTPie-Ausgabe, beschränkt auf Anfrage-Header und -Body.
(Bild: Lang / HTTPie)

Via „--print“ lassen sich explizit Header und Body der Anfrage (H und B) sowie der Antwort (h und b) angeben. Die Optionen „--style“ und „--pretty“ ermöglichen zudem eine optisch wunschgemäße Ausgabe, beispielsweise von Antworten im JSON-Format.

Real-World-Beispiele

Wie viel einfacher das Leben mit HTTPie werden kann, soll ein echtes Beispiel im direkten Vergleich mit cURL zeigen: Folgendes Kommando liefert alle Hosts der Monitoring-Lösung Checkmk über dessen Swagger-API:

curl -X GET \
"http://192.168.178.68/mysite/check_mk/api/1.0/domain-types/host_config/collections/all" \
-H "accept: application/json" \
--header "Authorization: Bearer myusername mypassword" | python -m json.tool

Auszug der cURL-Anfrage.
Auszug der cURL-Anfrage.
(Bild: Lang / cURL)

Die JSON-Antwort muss letztlich noch formatiert werden, was hier Python direkt übernimmt. Es gibt Tools, die hübschere Ausgaben liefern, aber so gibt es nicht noch weitere Abhängigkeiten.

Nun dieselbe Anfrage mit HTTPie:

http \
"http://192.168.178.68/mysite/check_mk/api/1.0/domain-types/host_config/collections/all" \
'Authorization: Bearer myusername mypassword'

Auszug der http-Anfrage.
Auszug der http-Anfrage.
(Bild: Lang / HTTPie)

Dabei wird deutlich: selbst bei dieser simplen Anfrage gibt es schon deutlich weniger zu tippen – und das Ergebnis ist auch noch wesentlich ansehnlicher. In der Regel bleibt es aber nicht bei einer einzigen Anfrage; und um Dinge wie das Bearer-Token nicht jedes Mal übergeben zu müssen, bieten sich benamte Sessions an – die erste Anfrage:

http \
session=meinesession \
"http://192.168.178.68/mysite/check_mk/api/1.0/domain-types/host_config/collections/all" \
'Authorization: Bearer myusername mypassword'

Bei der nächsten Anfrage genügt dann:

http \
session=meinesession \
"http://192.168.178.68/mysite/check_mk/api/1.0/domain-types/host_config/collections/all" \

Natürlich ist es möglich, mehrere Sessions zu verwenden, um etwa mit unterschiedlichen Cookies, Nutzerrollen und so weiter zu spielen. Aber es geht noch deutlich kürzer – mit HTTP-Prompt, das sich wiederum über pip installieren lässt:

pip install http-prompt

Als Beispiel dient jetzt ein einfacher Aufruf eines Webhooks:

curl -X POST 192.168.178.123:9000/hooks/webhook_test

Auch mit HTTPie allein ließe sich hier nicht viel sparen, mit HTTP-Prompt hingegen schon:

http-prompt 192.168.178.27:9000

Damit sind Sie quasi auf dem angegeben Server eingeloggt und bekommen einen entsprechenden Prompt, auf dem Sie wiederum direkt mit HTTP-Methoden wie eben POST arbeiten dürfen:

http://192.168.178.27:9000> post hooks/webhook_test

Für diese POST-Anfrage wird HTTP-Prompt-intern wiederum HTTPie genutzt. HTTP-Prompt nimmt auch Optionen an, die dann automatisch HTTPie zur Verfügung stehen, beispielsweise eine Session. Wie genau HTTP-Prompt dann den http-Befehl gestaltet, zeigt eine Vorschau über den Befehl „httpie“:

http-prompt 192.168.178.27:9000 --session=meinesession
http://192.168.178.27:9000> httpie

Vorschau des http-Befehls in HTTP-Prompt mittels „httpie“.
Vorschau des http-Befehls in HTTP-Prompt mittels „httpie“.
(Bild: Lang / HTTPie)

HTTPie liefert dann zurück: „http --session=meinesession http://192.168.178.27:9000“ – dieser Aufruf wird dann angenommen, wenn Sie letztlich auf dem Prompt nur noch POST-, GET- oder sonstige Methoden direkt angeben.

OpenAPI-Zugriff

Swagger beziehungsweise OpenAPI haben wir kürzlich näher vorgestellt und HTTPie ist der perfekte Begleiter dafür. Als Beispiel soll nochmal Checkmk dienen, das eine Swagger-API bietet und in der Dokumentation neben cURL- und Python-Code-Beispielen auch solche für HTTPie liefert.

Beim HTTP-Prompt-Aufruf werden nun drei Daten übergeben, mit denen HTTPie anschließend arbeiten darf: Session, URL zur Swagger-Spezifikation und Authentifizierung:

http-prompt 192.168.178.68 \
--spec=http://192.168.178.68/mysite/check_mk/api/1.0/openapi-swagger-ui.json \
--session=foo \
--username="myusername" \
--password="mypassword"

Neu ist hier lediglich der Punkt „--spec“, über den die JSON-Datei der API angegeben wird. Das funktioniert übrigens genauso gut mit einer lokalen JSON-Datei. Wenn Sie hier wieder die Vorschau des http-Befehls via httpie aufrufen, ergibt sich:

http --session=foo http://192.168.178.68 --password=mypassword --username=myusername

Zum Abfragen genügt dann wieder …

get mysite/check_mk/api/1.0/domain-types/host_config/collections/all

Die Autovervollständigung von HTTP-Prompt.
Die Autovervollständigung von HTTP-Prompt.
(Bild: Lang / HTTPie)

Die spannende Frage bei APIs, die wohl niemand in- und auswendig kennt, ist dann aber: Welche API-Endpoints gibt es denn? Welche „domain-types“ gibt es? In der Hierarchie kann man schlicht und einfach mit den bekannten Kommandos ls und cd navigieren – inklusive Autovervollständigung:

http://192.168.178.68> ls domain-types/host_config

… zeigt dann die entsprechenden Pfade oder Endpunkte – wie von der Navigation im normalen Linux-Terminal bekannt.

Die beiden Tools können noch deutlich mehr, beispielsweise lassen sich Pipes nutzen, um etwa Inhalte von irgendwoher per GET zu beziehen und direkt per POST an anderer Stelle unterzubringen. Es lassen sich durch Shell-Ersetzungen Daten aus der normalen Shell in die HTTP-Prompt-Umgebung einlesen (password=='echo ~/.mypassord') .

HTTPie kann Downloads wiederaufnehmen oder auch an Tools wie Tar pipen und dabei trotzdem noch Header und Fortschritt anzuzeigen – und dergleichen. Wer mit Web-APIs arbeitet, sollte definitiv einen Blick auf HTTPie und HTTP-Prompt werfen – ausprobieren können Interessierte den HTTPie-Client auch direkt im Browser.

(ID:47377556)

Über den Autor

 Mirco Lang

Mirco Lang

Freier Journalist & BSIler