cURL vers code
cURL vers code transforme une commande curl en fetch, axios, Python requests, Go, PHP ou Ruby, directement dans votre navigateur. La commande est analysée comme du shell — guillemets simples, guillemets doubles, échappements ANSI-C, continuations de ligne et options groupées — donc une charge utile contenant une espace ou une apostrophe arrive intacte.
Comment fonctionne cURL vers code ?
La conversion paraît triviale et ne l’est pas, car une commande curl est du shell, pas un format de données. Trois choses cassent une implémentation naïve, et les trois sont fréquentes dans les commandes copiées depuis les outils de développement d’un navigateur.
La gestion des guillemets est la partie difficile
-d '{"name":"Ada Lovelace"}' est un seul argument contenant une espace. -H "Authorization: Bearer $TOKEN" contient une variable que le shell a déjà développée — ou pas. --data $'line\nbreak' utilise les guillemets ANSI-C, où \n est un véritable saut de ligne — et les mêmes caractères entre guillemets simples ordinaires sont un antislash littéral et un n. Aucune expression régulière ne peut démêler cela, car les règles d’échappement diffèrent d’un style de guillemets à l’autre. La commande est donc découpée en jetons par une petite machine à états qui sait dans quels guillemets elle se trouve, et les générateurs ne voient jamais que des arguments complets.
Les options groupées sont trois choses différentes
-sSL correspond à trois options nues. -XPOST est une seule option dont la valeur est collée. -H'X-Trace: 1' est une option à valeur, dont la valeur contient de la ponctuation et une espace. On les distingue en parcourant les lettres et en s’arrêtant à la première qui prend une valeur, exactement ce que fait l’analyseur de curl lui-même — et c’est pourquoi -sSXPOST donne un POST plutôt que six options.
Ce que le code généré refuse d’inventer
-d @payload.json lit un fichier à l’exécution. Le fichier n’est pas dans la commande, donc le corps ne peut pas être intégré tel quel : le code généré nomme le fichier et vous laisse la lecture, car deviner produirait un code qui envoie silencieusement la mauvaise charge utile. -k est l’autre omission délibérée — le code généré conserve la vérification des certificats et le dit dans un commentaire, car une option non sécurisée copiée dans un code source finit précisément ainsi en production.
Tout le reste se traduit directement : -u devient l’en-tête Authorization: Basic que curl envoie réellement, -b devient un en-tête Cookie, -F devient un formulaire multipart avec le boundary laissé au client HTTP, et -G déplace les données dans la chaîne de requête, là où curl les met.
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();
Quelles options et quels cas limites cURL vers code prend en charge ?
| Paramètre | Type | Valeur par défaut | Comportement et cas limites |
|---|---|---|---|
| -X, --request | méthode | POST s’il y a un corps | Définit la méthode HTTP. Sans cette option, la méthode est POST quand la commande contient un corps, un champ de formulaire ou -I, et GET sinon — c’est exactement la règle de curl lui-même. |
| -H, --header | en-têtes | aucun | À répéter une fois par en-tête. La forme -H "Name;" supprime un en-tête au lieu d’en définir un : le code généré ne l’envoie tout simplement pas, et la page l’indique plutôt que d’inventer une valeur. |
| -d, --data* | corps | aucun | Plusieurs options -d sont jointes avec &, exactement ce que fait curl. Un -d @fichier ne peut pas être intégré tel quel — le fichier n’est pas dans la commande — donc le code généré nomme le fichier et vous laisse la lecture. |
| --data-urlencode | corps | encodage de formulaire | La valeur est encodée en pourcentage avant de devenir le corps, si bien qu’une espace ou une esperluette dans la valeur ne pose aucun problème. C’est tout l’intérêt de cette option. |
| -F, --form | multipart | aucun | Devient un formulaire multipart. -F name=@fichier joint une partie fichier et -F name=valeur envoie une partie texte ; le boundary est laissé au client HTTP, car le définir à la main, c’est ainsi qu’une requête multipart finit mal formée. |
| -u, --user | authentification basique | aucune | Devient l’en-tête Authorization: Basic que curl envoie réellement, avec l’identifiant encodé en base64. Il reste visible dans le code généré parce qu’il était visible dans la commande. |
| -b, --cookie | en-tête Cookie | aucun | Une chaîne de cookies séparés par des points-virgules devient un unique en-tête Cookie, décomposé en paires nom/valeur, pour que le code généré se lise comme des données plutôt que comme une chaîne magique. |
| -G, --get | chaîne de requête | désactivée | Déplace chaque champ -d et --data-urlencode dans la chaîne de requête de l’URL et vide le corps : c’est ainsi que curl émet un GET avec une longue liste de paramètres. |
| -k, --insecure | note | désactivée | Non reproduite. Le code généré vérifie les certificats et embarque un commentaire précisant que la commande d’origine ne le faisait pas. Copier une option non sécurisée dans un code source, c’est ainsi qu’elle survit jusqu’en production. |
| --json | corps + en-têtes | aucun | Définit le corps, Content-Type: application/json et Accept: application/json, à l’image du raccourci ajouté par curl dans sa version 7.82. |
| -o, -m, --retry, --proxy | ignorées | — | Les chemins de sortie locaux, les délais d’attente, les nombres de tentatives et les réglages de proxy n’ont aucun équivalent dans la requête générée : l’outil les consomme puis les abandonne plutôt que de les traduire de travers. |
| Taille de sortie | octets | 256 KB | Une commande est courte par nature ; ce plafond existe pour qu’un fichier collé soit refusé plutôt que découpé en jetons. |
Questions fréquentes
Gère-t-il les commandes copiées depuis les DevTools de Chrome ou Firefox ?
Oui — c’est même la principale source des commandes que l’on colle ici. Les DevTools émettent des arguments entre guillemets simples, une continuation de ligne par antislash entre eux, et souvent une option `--compressed` ainsi qu’un long en-tête de cookies. Les trois cas sont gérés : la continuation est un saut de ligne et non du contenu ; --compressed est relevée puis ignorée, car chaque client de cette page négocie lui-même la compression ; et -b devient un en-tête Cookie.
Que se passe-t-il avec -d @payload.json ?
Le code généré nomme le fichier et vous laisse terminer la lecture. Impossible de l’intégrer tel quel : le contenu du fichier ne figure pas dans la commande, et inventer un corps de substitution produirait un code qui envoie silencieusement la mauvaise charge utile — un bogue qui n’apparaît que face à une vraie API. L’outil vous dit quel fichier il a vu plutôt que de deviner.
Pourquoi -k n’est-il pas repris ?
Parce que le copier, c’est précisément ainsi qu’une option non sécurisée finit en production. Le code généré conserve la vérification des certificats et embarque un commentaire signalant que l’original la désactivait : la décision reste ainsi visible et délibérée. Si vous en avez réellement besoin, le commentaire indique où changer cela — et dans Node, c’est une variable d’environnement plutôt qu’une modification du code.
Comment sont traités les variables shell et les caractères échappés ?
Les variables sont laissées telles quelles, car le shell les a déjà développées au moment où vous collez la commande — un $TOKEN littéral dans le texte signifie que la variable n’a pas été développée, et il reste donc en place, comme un espace réservé visible. L’échappement, lui, est interprété correctement : entre guillemets doubles, un antislash n’échappe que les cinq caractères que POSIX autorise ; entre guillemets simples, rien n’est échappé du tout ; et $'…' est la syntaxe de guillemets ANSI-C, où \n est un véritable saut de ligne.
Quelle cible choisir ?
fetch si le code va dans un navigateur ou dans Node 18+, ce qui est le cas le plus courant aujourd’hui. axios quand le projet l’utilise déjà, puisqu’il gère pour vous la sérialisation JSON et les codes d’erreur. Python requests pour un script, Go pour un service, PHP ou Ruby quand c’est la base de code en place. Les six produisent la même requête ; ils ne diffèrent que par la cérémonie qu’exige chaque langage.
Ma commande est-elle envoyée quelque part ?
Non. L’analyse et la génération s’exécutent toutes deux dans cet onglet. C’est important, car une commande curl contient souvent une clé d’API réelle, un cookie de session ou un jeton bearer — l’en-tête Authorization de l’exemple ci-dessus est précisément cela. Rien n’est transmis, et il n’existe aucune route d’API vers laquelle transmettre quoi que ce soit.
Quels outils liés devriez-vous utiliser ensuite ?
- Convertir JSON en TypeScriptGénère des interfaces depuis un exemple, optionnels compris
- Convertir JSON en PythonGénère des dataclasses, TypedDicts ou modèles Pydantic
- Convertir JSON en GoGénère des structs avec des tags json réellement fonctionnels
- Décoder un JWTLit un JSON Web Token et explique chaque champ