Interaktion mit der GitHub API über HTTPie
March 7, 2017
HTTPie ist ein modernes, benutzerfreundliches Kommandozeilen-Tool für HTTP-Anfragen, das sich als Alternative zu curl etabliert hat. Seine intuitive Syntax und die farbige, formatierte Ausgabe machen es ideal für das Testen, Debuggen und Prototyping von APIs direkt aus dem Terminal.
Diese Anleitung bietet eine Übersicht der grundlegenden httpie-Befehle für die Interaktion mit der GitHub REST API.
Installation
macOS (Homebrew):
brew install httpie
Linux (Debian/Ubuntu):
sudo apt-get install httpie
HTTPie: Grundlegende Syntax
Ein einfacher GET-Request wird wie folgt ausgeführt:
# Die Angabe von GET ist optional
http https://api.github.com
Wichtige Operatoren
key==value: Fügt einen URL-Query-Parameter hinzu (z.B. für Filterung oder Suche).key=value: Sendet Daten als JSON-Objekt im Request Body (fürPOST/PUT/PATCH).Header:Value: Definiert einen benutzerdefinierten HTTP-Header.@file.json: Sendet den Inhalt einer lokalen Datei als Request Body.:=: Sendet rohe JSON-Werte, z.B. Booleans, Zahlen oder Arrays.
Beispiel für Query-Parameter:
# Sucht nach Repositories mit 'tmux' und sortiert nach Sternen
http https://api.github.com/search/repositories q==tmux sort==stars
Grundlagen der GitHub API
Die GitHub REST API ist unter https://api.github.com erreichbar. Während viele Endpunkte öffentlich lesbar sind, unterliegen sie einem Rate Limiting.
Empfohlene Header für alle Anfragen:
Accept:application/vnd.github+json
X-GitHub-Api-Version:2022-11-28
Beispiel:
http https://api.github.com/users/torvalds \
Accept:application/vnd.github+json \
X-GitHub-Api-Version:2022-11-28
Authentifizierung
Für den Zugriff auf private Ressourcen oder zur Erhöhung der Rate Limits ist ein Personal Access Token (PAT) erforderlich.
-
Token als Umgebungsvariable speichern:
codeexport GITHUB_TOKEN=ghp_xxx -
Authentifizierte Anfrage senden:
codehttp https://api.github.com/user \ Authorization:"Bearer $GITHUB_TOKEN" \ Accept:application/vnd.github+json
Anwendungsbeispiele
GET-Anfragen
- Benutzerinformationen abrufen:
code
http https://api.github.com/users/octocat - Repository-Details abrufen:
code
http https://api.github.com/repos/octocat/Hello-World - Issues eines Repositories auflisten:
code
http https://api.github.com/repos/octocat/Hello-World/issues
POST-Anfrage: Issue erstellen
# Erstellt ein neues Issue mit Titel, Body und Labels
http POST https://api.github.com/repos/OWNER/REPO/issues \
Authorization:"Bearer $GITHUB_TOKEN" \
title="Bug: Button verursacht Layout-Fehler" \
body="Schritte zur Reproduktion:\n1. ...\n2. ..." \
labels:='["bug", "ui"]'
PATCH-Anfrage: Issue aktualisieren
# Schließt ein bestehendes Issue
http PATCH https://api.github.com/repos/OWNER/REPO/issues/ISSUE_NUMBER \
Authorization:"Bearer $GITHUB_TOKEN" \
state=closed
Paginierung
Antworten, die Listen von Elementen enthalten, sind oft paginiert. Die URLs für die nächste, vorherige, erste und letzte Seite befinden sich im Link-Header der Antwort.
Mit -h (oder --headers) können nur die Header der Antwort angezeigt werden:
# Zeigt Header an, um den 'Link'-Header zu inspizieren
http -h https://api.github.com/orgs/github/repos per_page==5
Achten Sie auf den Link-Header in der Ausgabe: Link: <...>; rel="next", <...>; rel="last".
Rate Limits überprüfen
Informationen über Ihr aktuelles Rate Limit können über folgenden Endpunkt abgerufen werden:
http https://api.github.com/rate_limit
Authentifizierte Anfragen erhalten ein deutlich höheres Limit.
Antworten mit jq filtern
Obwohl HTTPie JSON-Antworten formatiert ausgibt, ist jq ein nützliches Werkzeug, um spezifische Werte aus der Antwort zu extrahieren.
# Extrahiert nur die Anzahl der Sterne aus der Repository-Antwort
http https://api.github.com/repos/octocat/Hello-World | jq '.stargazers_count'
Fehleranalyse
401 Unauthorized: Der Token fehlt, ist ungültig oder hat nicht die erforderlichen Berechtigungen.403 Forbidden: Das Rate Limit wurde überschritten oder der Zugriff ist verboten.404 Not Found: Die angeforderte Ressource (z.B. User oder Repo) existiert nicht.422 Unprocessable Entity: Der gesendete Payload ist fehlerhaft (Validierungsfehler).