15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen
31.10.2024

HTTP-Anfragen in Linux verstehen: Struktur, Methoden & praktische Beispiele

HTTP (Hypertext Transfer Protocol) ist die grundlegende Kommunikationsschicht des modernen Webs. Jedes Mal, wenn ein Browser eine Seite lädt, ein API-Aufruf erfolgt oder ein Server eine Remote-Ressource abruft, ist eine HTTP-Anfrage der Kern dieser Interaktion. Für Linux-Systemadministratoren, Entwickler und DevOps-Ingenieure ist ein tiefes Verständnis dafür, wie HTTP-Anfragen strukturiert sind, welche Methoden zu verwenden sind und wie man sie von der Befehlszeile aus erstellt oder analysiert, nicht nur nützlich — es ist unverzichtbar.

Dieser umfassende Leitfaden schlüsselt die Anatomie einer HTTP-Anfrage auf, erklärt jede wichtige HTTP-Methode mit realen Beispielen und führt Sie durch die leistungsstärksten unter Linux verfügbaren Tools zum Senden, Debuggen und Analysieren von HTTP-Traffic. Unabhängig davon, ob Sie eine VPS Hosting-Umgebung verwalten, Webanwendungen auf einem dedizierten Server ausführen oder einfach die Grundlagen der Webkommunikation erlernen, dieser Artikel wird Ihre technische Grundlage schärfen.

Was ist eine HTTP-Anfrage?

Eine HTTP-Anfrage ist eine Nachricht, die von einem Client (z. B. einem Webbrowser, einer mobilen App oder einem Befehlszeilentool) an einen Server gesendet wird und ihn auffordert, eine bestimmte Aktion auf einer Ressource auszuführen. Der Server verarbeitet dann die Anfrage und gibt eine HTTP-Antwort zurück.

Dieser Client-Server-Austausch wird durch die HTTP-Spezifikation geregelt, die derzeit am weitesten als HTTP/1.1 und HTTP/2 verbreitet ist, wobei HTTP/3 (basierend auf QUIC) schnell an Akzeptanz gewinnt.

Anatomie einer HTTP-Anfrage

Jede HTTP-Anfrage besteht aus drei Hauptteilen: der Anfragzeile, Headern und einem optionalen Nachrichtentext. Das Verständnis jeder Komponente ist entscheidend für die Behebung von Problemen, das Erstellen von APIs und die korrekte Konfiguration von Webservern.

1. Die Anfragzeile

Die Anfragzeile ist immer die erste Zeile einer HTTP-Anfrage. Sie enthält drei durch Leerzeichen getrennte Elemente:

  • HTTP-Methode — die auszuführende Aktion (z. B. GET, POST, DELETE)
  • Request-URI — der Pfad zur Zielressource (z. B. /index.html oder /api/users)
  • HTTP-Version — die verwendete Protokollversion (z. B. HTTP/1.1)

Beispiel:

GET /index.html HTTP/1.1

2. Anfrage-Header

Header enthalten Metadaten über die Anfrage. Sie teilen dem Server die Fähigkeiten des Clients, das Format der gesendeten Daten, Authentifizierungsanmeldeinformationen, Caching-Voreinstellungen und vieles mehr mit. Jeder Header ist ein Schlüssel-Wert-Paar, das durch einen Doppelpunkt getrennt ist.

Häufige Header und ihre Zwecke:

HeaderZweck
HostGibt den Domänennamen des Servers an
User-AgentIdentifiziert die Client-Software, die die Anfrage stellt
AcceptTeilt dem Server mit, welche Inhaltstypen der Client verarbeiten kann
Content-TypeBeschreibt das Format des Anfragetexts
Content-LengthGibt die Größe des Anfragetexts in Bytes an
AuthorizationEnthält Authentifizierungsanmeldeinformationen
Accept-EncodingListet Komprimierungsalgorithmen auf, die der Client unterstützt
ConnectionSteuert, ob die Verbindung nach der Anfrage offen bleibt

Beispiel-Header:

Host: www.example.com
User-Agent: Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

3. Der Anfrage-Body

Nicht alle HTTP-Anfragen enthalten einen Body. Methoden wie GET und DELETE enthalten normalerweise keinen Body. Methoden wie POST, PUT und PATCH verwenden den Body, um Daten an den Server zu übertragen — zum Beispiel Formularübermittlungen, JSON-Payloads oder Datei-Uploads.

Vollständiges HTTP-Anfrage-Beispiel

Nachfolgend ist eine vollständige, realistische HTTP-Anfrage für einen Login-Endpunkt, der JSON-Anmeldeinformationen akzeptiert:

POST /login HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36
Content-Type: application/json
Content-Length: 57
Accept: application/json
Connection: keep-alive

{
  "username": "exampleUser",
  "password": "examplePassword"
}

Aufschlüsselung:

  • POST /login HTTP/1.1 — die Anfragzeile
  • Der Block von Schlüssel-Wert-Paaren — die Anfrage-Header
  • Das JSON-Objekt am unteren Rand — der Anfrage-Body

HTTP-Methoden erklärt

HTTP definiert eine Reihe von Anfragemethoden (auch HTTP-Verben genannt), die die gewünschte Aktion angeben, die auf der identifizierten Ressource ausgeführt werden soll. Jede Methode hat spezifische Semantik, Sicherheitsgarantien und Idempotenz-Charakteristiken, die Sie verstehen müssen, wenn Sie APIs entwerfen oder nutzen.

GET — Eine Ressource abrufen

Zweck: Daten vom Server abrufen, ohne sie zu ändern.

Charakteristiken:

  • Sicher — ändert den Serverzustand nicht
  • Idempotent — mehrfaches Aufrufen führt zum gleichen Ergebnis
  • Parameter werden über die URL-Abfragezeichenfolge übergeben
  • Sollte niemals zum Senden sensibler Daten verwendet werden

Beispiel:

GET /api/users?id=123 HTTP/1.1
Host: api.example.com
Accept: application/json

Anwendungsfälle: Laden von Webseiten, Abrufen von API-Daten, Abrufen von Dateien.

POST — Daten an den Server übermitteln

Zweck: Daten an den Server senden, um eine neue Ressource zu erstellen oder einen Prozess auszulösen.

Charakteristiken:

  • Nicht idempotent — das zweimalige Übermitteln der gleichen Anfrage kann doppelte Datensätze erstellen
  • Daten werden im Anfrage-Body gesendet
  • Wird häufig für Formularübermittlungen und API-Ressourcenerstellung verwendet

Beispiel:

POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 51

{
  "name": "John Doe",
  "email": "john@example.com"
}

Anwendungsfälle: Benutzerregistrierung, Login-Formulare, Erstellen von Datensätzen, Datei-Uploads.

PUT — Eine Ressource ersetzen oder erstellen

Zweck: Eine vorhandene Ressource vollständig ersetzen oder sie erstellen, falls sie noch nicht vorhanden ist, unter dem angegebenen URI.

Charakteristiken:

  • Idempotent — das mehrfache Senden der gleichen PUT-Anfrage führt immer zum gleichen Ressourcenzustand
  • Ersetzt die gesamte Ressource (im Gegensatz zu PATCH, das teilweise ist)

Beispiel:

PUT /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 52

{
  "name": "Jane Doe",
  "email": "jane@example.com"
}

Anwendungsfälle: Aktualisieren eines Benutzerprofils, Ersetzen einer Konfigurationsdatei über API.

DELETE — Eine Ressource entfernen

Zweck: Die angegebene Ressource vom Server löschen.

Charakteristiken:

  • Idempotent — das Löschen einer Ressource, die nicht mehr vorhanden ist, gibt immer noch eine erfolgreiche (oder 404) Antwort ohne zusätzliche Nebenwirkungen zurück
  • Enthält normalerweise keinen Anfrage-Body

Beispiel:

DELETE /api/users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Anwendungsfälle: Entfernen von Benutzerkonten, Löschen von Datensätzen, Bereinigung von Ressourcen.

PATCH — Eine Ressource teilweise aktualisieren

Zweck: Teilweise Änderungen auf eine vorhandene Ressource anwenden, nur die angegebenen Felder aktualisieren.

Charakteristiken:

  • Nicht unbedingt idempotent — je nach Implementierung können wiederholte Aufrufe unterschiedliche Auswirkungen haben
  • Bandbreiteneffizienter als PUT für kleine Updates

Beispiel:

PATCH /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 34

{
  "email": "jane.doe@example.com"
}

Anwendungsfälle: Aktualisieren eines einzelnen Feldes (z. B. E-Mail-Adresse), Umschalten eines Status-Flags.

Andere bemerkenswerte HTTP-Methoden

MethodeZweck
HEADWie GET, gibt aber nur Header zurück, keinen Body — nützlich zum Überprüfen der Ressourcenexistenz oder Metadaten
OPTIONSGibt die vom Server für eine bestimmte URL unterstützten HTTP-Methoden zurück — wird in CORS-Preflight-Anfragen verwendet
CONNECTStellt einen Tunnel zum Server her (wird für HTTPS über Proxys verwendet)
TRACEEchot die empfangene Anfrage an den Client zurück — hauptsächlich zu Diagnosezwecken

HTTP-Anfragen unter Linux erstellen: Tools & Beispiele

Linux bietet ein reichhaltiges Ökosystem von Befehlszeilentools zum Erstellen, Senden und Analysieren von HTTP-Anfragen. Hier sind die wichtigsten, die jeder Administrator und Entwickler kennen sollte.

1. curl — Das Schweizer Taschenmesser von HTTP

curl ist das am weitesten verbreitete Befehlszeilentool zum Übertragen von Daten über HTTP, HTTPS, FTP und Dutzende anderer Protokolle. Es ist auf praktisch jeder Linux-Distribution vorinstalliert und ist unverzichtbar für API-Tests, Scripting und Automatisierung.

Grundlegende GET-Anfrage:

curl -X GET https://api.example.com/users

GET-Anfrage mit ausführlicher Ausgabe (zeigt Header):

curl -v https://api.example.com/users

POST-Anfrage mit JSON-Body:

curl -X POST https://api.example.com/users 
  -H "Content-Type: application/json" 
  -d '{"name": "John Doe", "email": "john@example.com"}'

PUT-Anfrage zum Aktualisieren einer Ressource:

curl -X PUT https://api.example.com/users/123 
  -H "Content-Type: application/json" 
  -H "Authorization: Bearer YOUR_TOKEN" 
  -d '{"name": "Jane Doe", "email": "jane@example.com"}'

DELETE-Anfrage:

curl -X DELETE https://api.example.com/users/123 
  -H "Authorization: Bearer YOUR_TOKEN"

PATCH-Anfrage:

curl -X PATCH https://api.example.com/users/123 
  -H "Content-Type: application/json" 
  -d '{"email": "jane.doe@example.com"}'

Antwort in eine Datei speichern:

curl -o output.html https://www.example.com

Weiterleitungen automatisch folgen:

curl -L https://www.example.com

Wichtige curl-Flags zum Kennen:

FlagBeschreibung
-XGibt die HTTP-Methode an
-HFügt einen Anfrage-Header hinzu
-dSendet Daten im Anfrage-Body
-oSpeichert die Ausgabe in einer Datei
-vAktiviert den ausführlichen Modus (zeigt vollständige Anfrage/Antwort)
-IRuft nur Header ab (HEAD-Anfrage)
-LFolgt HTTP-Weiterleitungen
-uStellt Benutzername und Passwort für die Basis-Authentifizierung bereit
--insecureÜberspringt die SSL-Zertifikatsprüfung (nur zum Testen verwenden)

2. wget — Dateien und Seiten herunterladen

wget ist hauptsächlich zum Herunterladen von Dateien und zum Spiegeln von Websites konzipiert. Obwohl weniger vielseitig als curl für API-Arbeiten, zeichnet es sich durch rekursive Downloads und das Fortsetzen unterbrochener Übertragungen aus.

Datei herunterladen:

wget https://www.example.com/files/archive.zip

Unterbrochenen Download fortsetzen:

wget -c https://www.example.com/files/large-file.iso

Datei im Hintergrund herunterladen:

wget -b https://www.example.com/files/large-file.iso

Gesamte Website spiegeln:

wget --mirror --convert-links --adjust-extension --page-requisites https://www.example.com

POST-Anfrage mit wget senden:

wget --post-data='{"name":"John"}' 
  --header='Content-Type: application/json' 
  -O response.json 
  https://api.example.com/users

3. HTTPie — Benutzerfreundlicher HTTP-Client

HTTPie ist ein moderner, benutzerfreundlicher HTTP-Client für die Befehlszeile, der die Interaktion mit APIs so intuitiv wie möglich gestaltet. Seine saubere Syntax und farbcodierte, formatierte Ausgabe machen es zu einem Favoriten unter Entwicklern.

HTTPie installieren:

# Debian/Ubuntu
sudo apt install httpie

# RHEL/CentOS/Fedora
sudo dnf install httpie

GET-Anfrage:

http GET https://api.example.com/users

POST-Anfrage mit JSON (automatische Content-Type-Erkennung):

http POST https://api.example.com/users 
  name="John Doe" 
  email="john@example.com"

PUT-Anfrage mit Authentifizierung:

http PUT https://api.example.com/users/123 
  Authorization:"Bearer YOUR_TOKEN" 
  name="Jane Doe"

DELETE-Anfrage:

http DELETE https://api.example.com/users/123 
  Authorization:"Bearer YOUR_TOKEN"

HTTPie formatiert JSON-Antworten automatisch mit Syntax-Hervorhebung, was es viel einfacher macht, API-Antworten im Vergleich zu roher curl-Ausgabe zu lesen.

4. Telnet — Raw HTTP-Anfragen zum Lernen

Obwohl nicht praktisch für den Produktionseinsatz, ist telnet ein ausgezeichnetes Lernwerkzeug, um genau zu verstehen, wie eine HTTP-Anfrage auf der rohen TCP-Ebene aussieht. Es verbindet sich direkt mit Port 80 und lässt Sie HTTP-Anfragen manuell eingeben.

Mit einem Server verbinden:

telnet www.example.com 80

Geben Sie dann die folgende Anfrage ein (drücken Sie nach der letzten Zeile zweimal Enter):

GET / HTTP/1.1
Host: www.example.com
Connection: close

Sie sehen die rohe HTTP-Antwort, einschließlich Statuszeile, Header und Body — genau wie der Server sie sendet. Diese Übung ist unschätzbar für das Verständnis des Protokolls auf fundamentaler Ebene.

> Hinweis: Für HTTPS-Verbindungen verwenden Sie openssl s_client anstelle von Telnet, da Telnet TLS-Verschlüsselung nicht verarbeiten kann.

Raw HTTPS-Anfrage mit OpenSSL:

openssl s_client -connect www.example.com:443 -quiet

Geben Sie dann ein:

GET / HTTP/1.1
Host: www.example.com
Connection: close

5. Python — Scripting von HTTP-Anfragen

Für Automatisierung und Scripting ist die requests-Bibliothek von Python eines der beliebtesten Tools zum programmgesteuerten Erstellen von HTTP-Anfragen unter Linux.

Requests-Bibliothek installieren:

pip install requests

GET-Anfrage:

import requests

response = requests.get('https://api.example.com/users')
print(response.status_code)
print(response.json())

POST-Anfrage:

import requests

payload = {"name": "John Doe", "email": "john@example.com"}
response = requests.post('https://api.example.com/users', json=payload)
print(response.status_code)
print(response.json())

HTTP-Traffic unter Linux analysieren

Über das Erstellen von Anfragen hinaus bietet Linux leistungsstarke Tools zum Erfassen und Analysieren von HTTP-Traffic — unverzichtbare Fähigkeiten zum Debuggen, zur Leistungsoptimierung und zur Sicherheitsanalyse.

tcpdump — Netzwerkpakete erfassen

tcpdump ist ein Befehlszeilenpakete-Analyzer, der rohen Netzwerk-Traffic erfasst. Er ist auf praktisch jedem Linux-System verfügbar und erfordert Root- oder Sudo-Berechtigungen.

Alle HTTP- und HTTPS-Traffic erfassen:

sudo tcpdump -i any -A 'tcp port 80 or tcp port 443'

Traffic auf einer bestimmten Schnittstelle erfassen und in einer Datei speichern:

sudo tcpdump -i eth0 -w capture.pcap 'tcp port 80'

Gespeicherte Erfassungsdatei lesen:

sudo tcpdump -r capture.pcap

Traffic nach Host filtern:

sudo tcpdump -i any host www.example.com

Wireshark — GUI-Paketanalyse

Wireshark ist der Industrie-Standard-Grafikpaket-Analyzer. Sie können Traffic auf Ihrem Linux-Server mit tcpdump erfassen und in einer .pcap-Datei speichern, dann in Wireshark auf Ihrer Workstation öffnen, um eine tiefe Analyse durchzuführen.

Wireshark ermöglicht es Ihnen:

  • Vollständige HTTP-Konversationen zu rekonstruieren
  • Traffic nach Protokoll, IP, Port oder Inhalt zu filtern
  • Leistungsengpässe und Fehler zu identifizieren
  • Verdächtige oder böswillige Traffic-Muster zu erkennen

ngrep — Network Grep

ngrep kombiniert die Leistung von tcpdump mit grep-ähnlicher Musterabstimmung, was es einfach macht, nach bestimmten Zeichenfolgen im Netzwerk-Traffic zu suchen.

Nach HTTP GET-Anfragen suchen:

sudo ngrep -d any 'GET' 'tcp port 80'

Nach einem bestimmten Host im Traffic suchen:

sudo ngrep -d any 'example.com' 'tcp port 80 or tcp port 443'

HTTP-Statuscodes: Serverantworten verstehen

Wenn ein Server Ihre HTTP-Anfrage empfängt, antwortet er mit einem Statuscode, der Ihnen mitteilt, ob die Anfrage erfolgreich war, fehlgeschlagen ist oder weitere Maßnahmen erforderlich sind. Das Verständnis dieser Codes ist für das Debuggen unverzichtbar.

Code-BereichKategorieHäufige Beispiele
1xxInformativ100 Continue, 101 Switching Protocols
2xxErfolg200 OK, 201 Created, 204 No Content
3xxUmleitung301 Moved Permanently, 302 Found, 304 Not Modified
4xxClient-Fehler400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xxServer-Fehler500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable

HTTP-Anfragen sichern: HTTPS und SSL/TLS

In Produktionsumgebungen sollte der gesamte HTTP-Traffic mit HTTPS (HTTP über TLS/SSL) verschlüsselt werden. Das Senden von Anmeldeinformationen, API-Token oder sensiblen Daten über einfaches HTTP setzt diese der Abfangung durch jeden auf dem Netzwerkpfad aus.

Bei der Arbeit mit curl verwenden Sie immer https://-URLs. Wenn Sie bei der Entwicklung auf SSL-Zertifikatsfehler stoßen, können Sie die Verifizierung vorübergehend mit --insecure umgehen, aber tun Sie dies niemals in der Produktion.

So überprüfen Sie ein Server-SSL-Zertifikat von der Befehlszeile:

curl -vI https://www.example.com 2>&1 | grep -A 10 "SSL certificate"

Oder verwenden Sie OpenSSL direkt:

openssl s_client -connect www.example.com:443 -showcerts

Wenn Sie Webanwendungen hosten und diese mit einem vertrauenswürdigen SSL-Zertifikat sichern müssen, bietet AlexHost SSL-Zertifikate an, die einfach zu installieren und mit allen großen Webservern kompatibel sind, einschließlich Apache, Nginx und LiteSpeed.

Praktische Anwendungsfälle für Linux HTTP-Tools

Servergesundheit überwachen

Verwenden Sie curl in einem Cron-Job oder Überwachungsskript, um zu überprüfen, ob Ihre Webanwendung ordnungsgemäß antwortet:

#!/bin/bash
STATUS=$(curl -o /dev/null -s -w "%{http_code}" https://www.example.com/health)
if [ "$STATUS" != "200" ]; then
  echo "ALERT: Server returned HTTP $STATUS" | mail -s "Health Check Failed" admin@example.com
fi

API-Endpunkte während der Entwicklung testen

15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen