En une phrase
Un convertisseur "cURL vers Code" traduit une requête web écrite dans la syntaxe universelle de la ligne de commande cURL en code équivalent et prêt à l'emploi pour des langages comme JavaScript, Python ou Go.
Le problème que ça résout
Au commencement, il y avait le terminal. Et dans le terminal, si vous vouliez parler à internet, il vous fallait un outil. En 1997, un développeur suédois du nom de Daniel Stenberg en a créé un pour récupérer les taux de change pour un bot IRC. Il l'a appelé curl, pour "Client for URL". Depuis, c'est devenu le couteau suisse incontesté des opérations réseau — un programme minuscule, absurdement puissant, capable de parler HTTP, FTP, SMTP et une douzaine d'autres protocoles directement depuis votre ligne de commande.
Parce qu'il est universel, textuel et ridiculement capable, curl est devenu le standard de facto pour documenter les appels d'API. Prenez n'importe quelle API moderne — Stripe, GitHub, Twilio — et leur guide de démarrage vous montrera presque certainement une commande curl. C'est le moyen parfait et sans ambiguïté de dire : "Voici la requête exacte que vous devez envoyer à notre serveur."
C'est génial... jusqu'à ce que vous deviez réellement écrire le code.
Vous êtes dans votre appli React. La doc dit :
curl -X POST https://api.pizza.dev/orders -H 'Authorization: Bearer ...' --data '{"size":"large","toppings":["pepperoni","cheese"]}'
Maintenant, vous devez traduire ça manuellement en un appel fetch JavaScript. Voyons voir... c'est quoi l'équivalent fetch de -X POST ? OK, method: 'POST'. Et pour -H pour le header ? Ça, c'est l'objet headers. Et --data ? C'est le body ? Je colle juste la chaîne de caractères dedans ? Ou j'ai besoin de JSON.stringify() ? Attendez, le header Content-Type ne devrait-il pas être application/json ? La commande curl ne l'avait pas ! (Spoiler : curl l'ajoute parfois pour vous, parfois non, selon le flag. Amusant, n'est-ce pas ?)
Cette traduction manuelle est un champ de mines rempli de petites erreurs exaspérantes. C'est fastidieux, propice aux bugs, et une perte totale de matière grise. Un convertisseur cURL vers Code résout ce problème en agissant comme un traducteur parfait et patient. Il prend le langage universel de la doc d'API et le convertit dans le dialecte spécifique que parle votre application, vous faisant gagner du temps, des bugs, et vous évitant de hurler dans le vide des "pourquoi j'ai une erreur 400 Bad Request ?!".
Comment ça marche sous le capot
À la base, un convertisseur cURL vers Code est un analyseur (parser) spécialisé. Il n'exécute pas réellement la commande curl. Au lieu de ça, il lit la commande comme une chaîne de texte et la décortique, token par token, en associant chaque morceau à un concept correspondant dans le langage de programmation cible.
Décortiquons la traduction d'une commande moyennement complexe :
curl -X POST 'https://api.example.com/v1/users' \
-H 'Authorization: Bearer my-secret-token' \
-H 'Content-Type: application/json' \
--data-raw '{"name": "Alice", "role": "admin"}' \
-L
Un bon parser va "mâcher" cette commande en plusieurs étapes.
### La commande, les arguments et l'URL
D'abord, le parser découpe la commande au niveau des espaces, en respectant les guillemets. Il voit curl, -X, POST, 'https://api.example.com/v1/users', et ainsi de suite.
curl: Ceci identifie le type de commande. Le parser sait qu'il a affaire à la syntaxe cURL.'https://api.example.com/v1/users': C'est le premier argument qui n'est pas un flag (c'est-à-dire qui ne commence pas par un-). Le parser l'identifie correctement comme l'URL cible. Cela devient l'argument principal pour presque n'importe quelle bibliothèque HTTP.
// JavaScript fetch
fetch('https://api.example.com/v1/users', { /* ... options */ });
# Python requests
requests.post('https://api.example.com/v1/users', **options)
### La méthode : -X POST
Le flag -X (ou --request) définit explicitement la méthode HTTP. Le parser voit -X et sait que le token suivant, POST, est la méthode. Si aucun -X n'est présent, la méthode par défaut est GET (sauf si un flag de données comme -d est utilisé, ce qui implique POST).
Cela correspond directement au paramètre de méthode dans le langage cible.
// JavaScript fetch
{
method: 'POST'
}
// Go net/http
req, err := http.NewRequest("POST", url, ...)
### Les headers : -H
Le flag -H (ou --header) peut apparaître plusieurs fois. Le parser les ramasse tous et les rassemble dans une structure clé-valeur.
-H 'Authorization: Bearer my-secret-token'->Authorization:Bearer my-secret-token-H 'Content-Type: application/json'->Content-Type:application/json
Cette collection devient un dictionnaire, une map, ou un objet simple dans le code généré.
// JavaScript fetch
{
headers: {
'Authorization': 'Bearer my-secret-token',
'Content-Type': 'application/json'
}
}
### Le corps de la requête (Body) : --data-raw
C'est là que les choses deviennent intéressantes et que les bons convertisseurs brillent. cURL a de nombreux flags pour envoyer des données :
-d, --data: Envoie les données encodées en URL. Définit par défaut leContent-Typeàapplication/x-www-form-urlencoded.--data-raw: Envoie les données telles quelles, sans traitement supplémentaire.--data-binary: Envoie les données sous forme binaire.-F, --form: Crée une requêtemultipart/form-data, généralement pour les téléversements de fichiers.
Notre exemple utilise --data-raw, ce qui est un indice fort que le corps de la requête est pré-formaté, probablement en JSON. Le parser récupère la chaîne suivante : '{"name": "Alice", "role": "admin"}'.
Le convertisseur place ensuite cette chaîne dans le corps de la requête. Pour un langage comme Python, il peut passer la chaîne directement. Pour JavaScript, la bonne pratique est de montrer à l'utilisateur un objet JS natif et de l'envelopper dans JSON.stringify().
// JavaScript fetch
{
body: JSON.stringify({
name: "Alice",
role: "admin"
})
}
# Python requests
# La bibliothèque 'requests' est intelligente ; si vous fournissez une chaîne de caractères et un Content-Type JSON...
# elle enverra la chaîne. Ou vous pouvez utiliser l'assistant json :
response = requests.post(url, headers=headers, json={"name": "Alice", "role": "admin"})
### Les autres flags : -L
Le flag -L (ou --location) dit à curl de suivre les redirections HTTP (par exemple, une réponse 301 ou 302). Le parser associe cela à l'option équivalente dans la bibliothèque cible.
// JavaScript fetch
{
redirect: 'follow'
}
En assemblant toutes ces pièces traduites, le parser génère un bloc de code complet et syntaxiquement correct.
Voici une correspondance simplifiée des flags courants :
| Flag cURL | Signification | Correspond à... |
|---|---|---|
(pas de flag) |
URL | L'argument URL cible |
-X, --request |
Méthode HTTP (GET, POST, etc.) | Propriété method, nom de la fonction |
-H, --header |
Header de la requête | Objet/dictionnaire headers |
-d, --data |
Corps de la requête (encodé en URL) | Propriété body, paramètre data |
--data-raw |
Corps de la requête (tel quel) | Propriété body, paramètre data |
-u, --user |
Authentification Basic | Header Authorization (Basic <base64>) |
-L, --location |
Suivre les redirections | Option redirect: 'follow' |
--compressed |
Demander une réponse compressée | Header Accept-Encoding |
-i, --include |
Inclure les headers de réponse | (Ignoré ; un flag pour la sortie) |
Histoires vécues
### La développeuse front-end et le flag trompeur
Chloé, une développeuse front-end, intégrait une API tierce de livraison. La doc fournissait une commande curl pour obtenir un devis. Elle a méticuleusement copié les headers et le body JSON dans sa requête fetch. Ça échouait à chaque fois avec une erreur 400 Bad Request. Après s'être cogné la tête contre les murs pendant une heure, elle a remarqué que l'exemple curl utilisait -d, et non --data-raw. Son appel fetch envoyait du JSON brut, mais le serveur, suivant les implications de -d, s'attendait à une chaîne encodée en URL. L'API était mal conçue, mais la commande curl était techniquement correcte. Frustrée, elle a collé la commande dans un convertisseur cURL. Celui-ci a craché un snippet JavaScript qui encapsulait correctement les données dans un objet URLSearchParams. La requête a fonctionné instantanément.
Leçon : Un convertisseur cURL comprend les comportements subtils et implicites des flags curl que même les développeurs expérimentés peuvent rater, économisant des heures de débogage.
### L'ingénieur DevOps et le webhook de 3h du matin
Ben, un ingénieur DevOps, mettait en place un système d'alerte d'urgence. Si le CPU de la base de données principale dépassait 95% pendant cinq minutes, un script devait poster un message sur un webhook PagerDuty. La doc de PagerDuty fournissait une commande curl toute propre. L'automatisation de Ben était écrite en Go. Il aurait pu passer 15 minutes à chercher la syntaxe de net/http en Go, à comprendre comment créer une requête, définir des headers et attacher un body JSON. Au lieu de ça, il a balancé la commande curl dans un convertisseur, sélectionné "Go", et a obtenu le code exact dont il avait besoin en cinq secondes. Il l'a collé dans son script, l'a testé, et est passé à autre chose.
Leçon : Pour le scripting et l'automatisation, les convertisseurs cURL sont un énorme gain de productivité, éliminant le changement de contexte nécessaire pour rechercher la syntaxe du client HTTP spécifique à un langage.
### Le débutant et la "Pierre de Rosette"
Sam apprenait le développement web et venait d'entendre parler des API. Le concept de "code qui parle à un autre code" était encore flou. Il a trouvé une API météo amusante et gratuite, et sa documentation montrait une commande curl pour obtenir les prévisions pour Londres. Il l'a exécutée dans son terminal et a vu un flux de données JSON apparaître. C'était comme de la magie ! Mais comment pouvait-il mettre ces données sur une page web ? Il a collé la commande curl dans un convertisseur et a vu le code fetch. Soudain, tout s'est éclairé. L'URL de la commande était le premier argument de fetch. Le flag -H devenait un objet headers. La commande abstraite du terminal s'est transformée en un bloc de code concret et lisible qu'il pouvait utiliser directement dans son projet.
Leçon : Un convertisseur cURL agit comme une "Pierre de Rosette", comblant le fossé entre les commandes abstraites et le code du monde réel, ce qui en fait un outil d'apprentissage inestimable.
Erreurs et pièges courants
- Oublier le contexte du shell. Une commande comme
curl "https://api.com?q=$USER"verra la variable$USERremplacée par votre shell avant même quecurlne s'exécute. Un convertisseur ne voit que la chaîne"$USER"et ne peut pas connaître sa valeur. Faites attention aux expansions du shell et copiez la commande "finale". - Le piège du
-dvs.--data-raw. C'est le grand classique. Si votre API attend du JSON, vous voulez presque certainement utiliser--data-rawavec un headerContent-Type: application/json. Utiliser-dencodera votre JSON en URL ({devient%7B,"devient%22, etc.), ce qui fera planter la plupart des API JSON. - Ignorer les téléversements de fichiers. Convertir une requête
multipart/form-data(en utilisant-Fou--form) est délicat. Le code généré doit gérer la lecture du fichier et créer un objetFormDataspécial. Les convertisseurs simples échouent souvent ici, produisant du code qui envoie un nom de fichier sous forme de chaîne de caractères au lieu du contenu du fichier. - Confondre les flags de requête et de sortie. Des flags comme
-v(verbose),-s(silent), ou-o file.txt(output to file) contrôlent commentcurlaffiche les informations. Ils ne font pas partie de la requête HTTP envoyée au serveur. Un bon convertisseur devrait les reconnaître et les ignorer, car ils n'ont pas d'équivalent dans une bibliothèque client HTTP. - Guillemets simples vs. doubles. Dans
bashet d'autres shells, les guillemets simples (') traitent leur contenu littéralement, tandis que les guillemets doubles (") permettent l'expansion des variables. Cela peut affecter la chaîne que le convertisseur voit réellement. Assurez-vous toujours que ce que vous copiez est ce que vous avez l'intention d'envoyer.
Pourquoi vous devriez garder ça sur votre radar
Tôt ou tard, tout développeur qui touche au web interagira avec une commande curl. Savoir comment les traduire rapidement et de manière fiable est un super-pouvoir.
- Pour consommer n'importe quelle API : C'est le cas d'utilisation principal. La doc des API est écrite en
curl. Votre appli, non. Comblez le fossé. - Pour déboguer des requêtes réseau : Les outils de développement des navigateurs modernes vous permettent de faire un clic droit sur n'importe quelle requête réseau et de la "Copier en tant que cURL". Vous pouvez ensuite la coller dans un convertisseur pour répliquer la requête exacte de votre navigateur dans un script Python ou Node.js pour un débogage plus isolé et puissant.
- Pour écrire de l'automatisation et des scripts : Besoin d'appeler un endpoint depuis un script Python, un utilitaire Go ou une tâche cron PHP ? Trouvez la commande
curlet convertissez-la. C'est plus rapide que de chercher la syntaxe à partir de zéro à chaque fois. - Pour apprendre un nouveau langage : Si vous connaissez
curlmais que vous découvrez Axios, la bibliothèquerequestsde Python, ounet/httpde Go, un convertisseur est un outil pédagogique fantastique. Il vous montre la manière idiomatique de faire une requête familière dans un environnement inconnu.
Pour aller plus loin
- Everything cURL: Le guide définitif de cURL, écrit par son créateur, Daniel Stenberg.
curlMan Page: La référence officielle et exhaustive pour chaque flag et option.- MDN: Utiliser l'API Fetch: La bible pour faire des requêtes web en JavaScript moderne.
- Démarrage rapide de Python
requests: La documentation de ce qui est sans doute la bibliothèque client HTTP la plus appréciée, tous langages confondus. - RFC 9110: Sémantique HTTP: Pour quand vous voulez vraiment, vraiment savoir ce qui se passe sous le capot de HTTP lui-même.
- Wikipédia : cURL: Un aperçu de haut niveau de l'histoire et des capacités de l'outil.