Zum Hauptinhalt springen

cURL zu Code

cURL zu Code wandelt einen curl-Befehl in fetch, axios, Python requests, Go, PHP oder Ruby um – direkt in Ihrem Browser. Der Befehl wird als Shell geparst – einfache Anführungszeichen, doppelte Anführungszeichen, ANSI-C-Escapes, Zeilenfortsetzungen und zusammengefasste Flags – sodass ein Payload, der ein Leerzeichen oder einen Apostroph enthält, unversehrt bleibt.

Nur lokal
Sprache
cURL-Befehl
0 B1 ZeileZ. 1, Sp. 1
JavaScript fetch · Jeder moderne Browser oder Node 18+schreibgeschützt
0 B1 Zeile

Wie funktioniert cURL zu Code?

Die Umwandlung sieht trivial aus und ist es nicht, denn ein curl-Befehl ist Shell und kein Datenformat. Drei Dinge brechen eine naive Implementierung, und alle drei sind häufig in Befehlen, die aus den Entwicklertools eines Browsers kopiert wurden.

Das Quoting ist der schwierige Teil

-d '{"name":"Ada Lovelace"}' ist ein einziges Argument mit einem Leerzeichen darin. -H "Authorization: Bearer $TOKEN" enthält eine Variable, die die Shell bereits expandiert hat – oder eben nicht. --data $'line\nbreak' verwendet ANSI-C-Quoting, wo \n ein echter Zeilenumbruch ist – dieselben Zeichen in gewöhnlichen einfachen Anführungszeichen sind dagegen ein wörtlicher Backslash und ein n. Kein regulärer Ausdruck kann das rückgängig machen, denn die Escaping-Regeln unterscheiden sich je nach Quoting-Stil. Deshalb wird der Befehl von einem kleinen Zustandsautomaten in Argumente zerlegt, der mitverfolgt, von welcher Art Anführungszeichen er gerade umgeben ist, und die Emitter sehen ausschließlich fertige Argumente.

Zusammengefasste Flags sind drei verschiedene Dinge

-sSL sind drei einzelne Flags. -XPOST ist ein Flag mit angehängtem Wert. -H'X-Trace: 1' ist ein Flag, das einen Wert entgegennimmt, und dieser Wert enthält Satzzeichen und ein Leerzeichen. Auseinandergehalten werden sie, indem man die Buchstaben durchgeht und beim ersten anhält, der einen Wert annimmt – genau so arbeitet der Parser von curl selbst, und deshalb kommt -sSXPOST als POST heraus und nicht als sechs Flags.

Was der generierte Code nicht erfindet

-d @payload.json liest eine Datei zur Laufzeit. Die Datei steht nicht im Befehl, also lässt sich der Body nicht inline einfügen: Der generierte Code nennt die Datei und überlässt das Einlesen Ihnen, denn Raten würde Code erzeugen, der stillschweigend den falschen Payload postet. -k ist die zweite bewusste Auslassung – der generierte Code lässt die Zertifikatsprüfung aktiviert und sagt das in einem Kommentar, denn ein unsicheres Flag, das in eine Codebasis kopiert wird, landet genau so in der Produktion.

Alles andere übersetzt sich direkt: -u wird zu dem Authorization: Basic-Header, den curl tatsächlich sendet, -b wird zu einem Cookie-Header, -F wird zu einem Multipart-Formular, dessen Boundary der HTTP-Client setzt, und -G verschiebt die Daten in den Query-String, wo curl sie auch platziert.

curl

curl -X POST 'https://api.example.com/v1/orders' \
  -H 'Content-Type: application/json' \
  -d '{"total":148.5}'

fetch

const response = await fetch("https://api.example.com/v1/orders", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "total": 148.5
  }, null, 2),
});

const data = await response.json();

curl → fetch

curl

curl -X POST 'https://api.example.com/v1/orders' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_TOKEN_HERE' \
  -d '{"total":148.5}'

fetch

const response = await fetch("https://api.example.com/v1/orders", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer YOUR_API_TOKEN_HERE",
  },
  body: JSON.stringify({
    "total": 148.5
  }, null, 2),
});

const data = await response.json();

Welche Optionen und Sonderfälle unterstützt cURL zu Code?

Technische Referenz und Optionen
ParameterTypStandardVerhalten & Sonderfälle
-X, --requestMethodePOST, wenn es einen Body gibtSetzt die HTTP-Methode. Ohne diese Option lautet die Methode POST, wenn der Befehl einen Body, ein Formularfeld oder -I enthält, sonst GET – genau die Regel, die auch curl selbst anwendet.
-H, --headerHeaderkeineWird pro Header je einmal angegeben. Die Form -H "Name;" entfernt einen Header, statt ihn zu setzen; der generierte Code sendet ihn dann schlicht nicht, und die Seite sagt das auch, statt einen Wert zu erfinden.
-d, --data*BodykeineMehrere -d-Flags werden mit & verkettet, genau wie curl es tut. -d @file lässt sich nicht inline einfügen, denn die Datei steht ja nicht im Befehl – der generierte Code nennt sie deshalb und überlässt das Einlesen Ihnen.
--data-urlencodeBodyform-urlencodedDer Wert wird prozentkodiert, bevor er zum Body wird, sodass ein Leerzeichen oder ein kaufmännisches Und im Wert unschädlich ist. Genau das ist der Sinn des Flags.
-F, --formMultipartkeineWird zu einem Multipart-Formular. -F name=@file hängt einen Datei-Part an, -F name=value sendet einen Text-Part; den Boundary überlässt man dem HTTP-Client, denn setzt man ihn von Hand, wird der Multipart-Request fehlerhaft.
-u, --userBasic AuthkeineWird zu dem Authorization: Basic-Header, den curl tatsächlich sendet, wobei die Zugangsdaten base64-kodiert sind. Er ist im generierten Code sichtbar, weil er auch im Befehl sichtbar war.
-b, --cookieCookie-HeaderkeineEin durch Semikolons getrennter Cookie-String wird zu einem einzigen Cookie-Header, aufgeschlüsselt in Name/Wert-Paare, damit der generierte Code wie Daten liest und nicht wie ein magischer String.
-G, --getQuery-StringausVerschiebt jedes -d- und --data-urlencode-Feld in den Query-String der URL und leert den Body – so setzt curl ein GET mit langer Parameterliste ab.
-k, --insecureHinweisausWird nicht übernommen. Der generierte Code verifiziert Zertifikate und enthält einen Kommentar, der sagt, dass der ursprüngliche Befehl es nicht tat. Ein unsicheres Flag in eine Codebasis zu kopieren ist genau der Weg, auf dem es bis in die Produktion überlebt.
--jsonBody + HeaderkeineSetzt den Body, Content-Type: application/json und Accept: application/json – entsprechend der Kurzschreibweise, die curl in 7.82 eingeführt hat.
-o, -m, --retry, --proxyignoriert—Lokale Ausgabepfade, Timeouts, Wiederholungsanzahlen und Proxy-Einstellungen haben kein Äquivalent im generierten Request, deshalb werden sie eingelesen und verworfen, statt sie falsch zu übersetzen.
AusgabegrößeBytes256 KBEin Befehl ist von Natur aus kurz; die Obergrenze existiert, damit eine eingefügte Datei abgelehnt wird, statt in Tokens zerlegt zu werden.

Häufig gestellte Fragen

Kann das Tool Befehle verarbeiten, die aus Chrome- oder Firefox-DevTools kopiert wurden?

Ja – das ist die Hauptquelle der Befehle, die Leute hierher bringen. DevTools erzeugt Argumente in einfachen Anführungszeichen, zwischen ihnen eine Fortsetzung aus Backslash und Zeilenumbruch, und oft dazu ein `--compressed`-Flag und einen langen Cookie-Header. Alle drei werden behandelt: Die Fortsetzung ist ein Zeilenumbruch und kein Inhalt, --compressed wird vermerkt und verworfen, weil jeder Client hier die Kompression selbst aushandelt, und -b wird zu einem Cookie-Header.

Was passiert mit -d @payload.json?

Der generierte Code nennt die Datei und überlässt das Einlesen Ihnen. Sie lässt sich nicht inline einfügen: Der Inhalt der Datei steht nicht im Befehl, und ein erfundener Platzhalter-Body würde Code erzeugen, der stillschweigend den falschen Payload postet – ein Bug, der erst gegenüber einer echten API auffällt. Das Tool sagt Ihnen, welche Datei es gesehen hat, statt zu raten.

Warum wird -k nicht übernommen?

Weil das Kopieren genau der Weg ist, auf dem ein unsicheres Flag in die Produktion gelangt. Der generierte Code lässt die Zertifikatsprüfung aktiviert und enthält einen Kommentar, der sagt, dass das Original sie deaktiviert hatte – die Entscheidung bleibt damit sichtbar und bewusst. Wenn Sie es wirklich brauchen, sagt der Kommentar, wo Sie es ändern – und in Node ist es eine einzige Umgebungsvariable statt einer Code-Änderung.

Wie werden Shell-Variablen und Escape-Zeichen behandelt?

Variablen bleiben, wie sie dastehen, denn die Shell hat sie bereits expandiert, bevor Sie den Befehl einfügen – ein wörtliches $TOKEN im Text bedeutet, dass die Variable nicht expandiert wurde, und bleibt daher als sichtbarer Platzhalter stehen. Escaping wird korrekt interpretiert: Innerhalb doppelter Anführungszeichen maskiert ein Backslash nur die fünf Zeichen, die POSIX dafür vorsieht; innerhalb einfacher Anführungszeichen wird gar nichts maskiert; und $'…' ist ANSI-C-Quoting, wo \n ein echter Zeilenumbruch ist.

Welches Ziel sollte ich wählen?

fetch, wenn der Code in einen Browser oder Node 18+ geht – das sind heute die meisten Fälle. axios, wenn das Projekt es bereits nutzt, da es JSON-Serialisierung und Fehler-Statuscodes für Sie übernimmt. Python requests für ein Skript, Go für einen Dienst, PHP oder Ruby, wenn das die Codebasis ist. Alle sechs erzeugen denselben Request; sie unterscheiden sich nur darin, wie viel Zeremonie die Sprache braucht.

Wird mein Befehl irgendwohin gesendet?

Nein. Parsen und Generierung laufen beide in diesem Tab. Das ist wichtig, weil ein curl-Befehl häufig einen echten API-Schlüssel, ein Session-Cookie oder ein Bearer-Token enthält – der Authorization-Header im Beispiel oben ist genau das. Nichts wird übertragen, und es gibt keine API-Route, an die etwas übertragen werden könnte.