Guide des requêtes POST avec cURL

Découvrez les requêtes POST avec cURL : de quoi s’agit-il, comment envoyer une requête POST avec cURL, etc.
14 min read
curl post request guide

cURL est un outil de ligne de commande pour transférer des données à l’aide de divers protocoles réseau. Disponible sur tous les principaux systèmes d’exploitation, cURL est devenu l’outil standard utilisé pour envoyer des requêtes HTTP à partir de la ligne de commande.

L’utilitaire multiplateforme de cURL prend en charge des protocoles tels que HTTP, HTTPS, FTP et IMAP, ce qui facilite l’envoi de requêtes à des API et le web scraping avec cURL. Avec sa grande disponibilité et sa prise en charge de différents protocoles, cURL est souvent présenté dans la documentation des API REST comme un moyen rapide de tester des appels d’API directement à partir de la ligne de commande :

Découvrez comment envoyer des requêtes POST en utilisant cURL à partir de la ligne de commande

Dans cet article, vous apprendrez à envoyer des requêtes POST à l’aide de cURL à partir de la ligne de commande.

Qu’est-ce qu’une requête POST ?

Une requête POST est une méthode HTTP permettant d’envoyer des données à un serveur ; c’est l’une des méthodes HTTP les plus couramment employées.

Lorsque vous envoyez une requête POST, les données transmises sont incluses dans le corps de la requête. Cela vous permet d’envoyer des données plus discrètement que de les envoyer dans l’URL (comme vous le feriez avec une requête GET). Vous pouvez également envoyer beaucoup plus de données dans une requête POST, en contournant les restrictions de longueur d’URL imposées par les navigateurs pour les requêtes GET.

Vous trouverez souvent des requêtes POST utilisées pour soumettre des formulaires, télécharger des fichiers ou envoyer des données JSON à une API. Par comparaison avec les requêtes GET, les requêtes POST ne sont généralement pas mises en cache et les données ne sont pas affichées dans l’historique de votre navigateur car les données de la requête se trouvent dans le corps de la requête.

Comment envoyer une requête POST avec cURL

Avant de commencer ce tutoriel, vous devez installer cURL sur votre ordinateur. Exécutez la commande suivante pour vérifier si cURL est bien installé :

curl --version

Si vous obtenez une erreur indiquant que la commande est introuvable, c’est que vous devez installer l’utilitaire.

Installation de cURL

Voici des instructions permettant d’installer cURL sur tous les principaux systèmes d’exploitation :

Windows

Sous Windows, vous pouvez utiliser Winget, qui est le gestionnaire de packages par défaut dans Windows 11, pour installer cURL :

winget install curl.curl

Chocolatey est un autre gestionnaire de packages Windows qui vous permet d’installer cURL avec la commande suivante :

choco install curl

Linux

cURL est disponible dans la plupart des gestionnaires de packages Linux. Sous Ubuntu/Debian, utilisez la commande suivante pour installer cURL :

apt-get install curl

Red Hat Enterprise Linux (RHEL), CentOS et Fedora vous permettent d’installer cURL à l’aide de Yellowdog Updater Modified (YUM), comme ceci :

yum install curl

Si vous utilisez OpenSUSE, vous pouvez installer cURL à l’aide de la commande terminal suivante :

zypper install curl

Enfin, Arch Linux vous permet d’utiliser pacman pour installer cURL avec la commande suivante :

pacman -Sy curl

macOS

Homebrew est le moyen le plus simple d’installer cURL sur MacOS. Assurez-vous que Homebrew est bien installé, puis exécutez la commande suivante :

brew install curl

Maintenant que vous avez installé cURL sur votre système d’exploitation, vous êtes prêt à apprendre à faire des requêtes POST.

Lancer une simple POST

cURL vous permet de spécifier plusieurs options lorsque vous envoyez des requêtes POST. Les sections suivantes présentent certaines fonctionnalités cURL courantes que vous pouvez rencontrer lorsque vous lancez des requêtes POST à l’aide de cet utilitaire.

Spécifier la méthode POST

Lorsque vous effectuez des requêtes HTTP à l’aide de cURL, vous devez spécifier la méthode HTTP que vous souhaitez exécuter. Les méthodes HTTP incluent GET, POST, PUT et DELETE. cURL vous permet de spécifier la méthode HTTP que vous souhaitez utiliser à l’aide de l’indicateur de ligne de commande -X.

Par exemple, pour envoyer une requête POST à https://httpbin.org/anything, vous pouvez exécuter la commande cURL suivante sur votre terminal :

curl -X POST https://httpbin.org/anything

httpbin.org fait écho au corps de la requête et aux en-têtes dans la réponse. Votre réponse devrait ressembler à ceci :

{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

L’option -X POST est l’équivalent de l’option --request POST ; vous pouvez donc également exécuter la commande suivante pour obtenir le même résultat :

curl --request POST https://httpbin.org/anything

La réponse est semblable à la précédente.

Vous pouvez en savoir plus sur les options -X et --request dans la documentation officielle.

Définir le Content-Type

Lorsque vous envoyez une requête POST, il est important de spécifier le type de contenu que vous envoyez dans le corps de la requête afin que le serveur puisse interpréter correctement le corps de la requête. Vous pouvez utiliser des types MIME dans l’en-tête Content-Type d’une requête HTTP pour spécifier le format du corps de la requête.

Par exemple, si vous envoyez du JSON dans le corps de la requête, vous devez indiquer au serveur web qu’il va recevoir du contenu JSON en définissant l’en-tête Content-Type sur application/json. Si vous envoyez du XML, votre en-tête Content-Type doit être application/xml. Pour plus d’informations sur Content-Type, consultez la documentation officielle.

cURL vous permet de spécifier les en-têtes d’une requête HTTP à l’aide de l’indicateur -H. Par exemple, si vous envoyez du JSON dans une requête POST, la commande cURL suivante vous montre comment définir l’en-tête Content-Type pour la requête :

curl -X POST -H 'Content-Type: application/json' -d '{}' https://httpbin.org/anything

Dans la réponse, vous pouvez voir l’en-tête Content-Type défini sur application/json :

{
  "args": {},
  "data": "{}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "2",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=-11111111-111111111111111111111111"
  },
  "json": {},
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

L’option -H peut également être spécifiée en utilisant l’option --header, plus longue. Dans ce cas, votre commande cURL doit ressembler à ceci :

curl -X POST --header 'Content-Type: application/json' -d '{}' https://httpbin.org/anything

La réponse devrait être semblable à la précédente.

Envoyer des données

Vous avez peut-être remarqué qu’un indicateur -d figurait dans les commandes précédentes. Cet indicateur vous permet de spécifier les données à envoyer dans le corps de la requête. Vous pouvez utiliser cet indicateur pour passer n’importe quelle chaîne de valeurs entourée de guillemets, comme ceci :

curl -X POST -H 'Content-Type: application/json' -d '{
    "FirstName": "Joe", 
    "LastName": "Soap" 
}' https://httpbin.org/anything

Vous remarquerez que httpbin.org affiche les données de corps que vous avez envoyées dans la propriété data de la réponse.

Si vous avez un fichier avec des données que vous voulez faire envoyer par cURL dans le corps de la requête, spécifiez le nom du fichier précédé du caractère @. La commande suivante lit le contenu de body.json et l’envoie via le corps de la requête :

curl -X POST -H 'Content-Type: application/json' -d @body.json https://httpbin.org/anything

Ici, le fichier body.json contient les éléments suivants :

{
    "FirstName": "Joe",
    "LastName": "Soap"
}

Lorsque vous envoyez cela, httpbin.org doit retourner la réponse suivante :

{
  "args": {},
  "data": "{\t\"FirstName\": \"Joe\",\t\"LastName\": \"Soap\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "41",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

L’indicateur --data se comporte de la même manière que -d ; vous pouvez donc les utiliser de manière interchangeable.

Envoyer des données JSON

Dans la section précédente, vous avez vu comment envoyer des données JSON en définissant l’en-tête Content-Type sur application/json, puis en transmettant les données JSON à l’aide de l’option -d. Lors de l’envoi d’une requête, il est également important de faire savoir au serveur web quel format de données vous attendez en réponse. Vous pouvez utiliser l’en-tête Accept avec la valeur application/json pour indiquer au serveur web que vous souhaitez recevoir une réponse en JSON.

La commande suivante envoie une requête JSON au serveur et indique au serveur que vous souhaitez recevoir du JSON en réponse :

curl -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Vous remarquerez que les propriétés data et json figurant dans le corps de la réponse contiennent les données JSON que vous avez envoyées dans la requête :

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

L’envoi et la réception de données JSON sont monnaie courante lors de l’envoi de requêtes HTTP. cURL propose donc un indicateur --json qui définit les en-têtes Content-Type et Accept pour vous et envoie les données JSON dans le corps de la requête. En utilisant cet indicateur, vous pouvez raccourcir votre commande pour envoyer du JSON dans une requête POST :

curl -X POST --json '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Cela donne la même réponse que précédemment :

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

L’indicateur --json a été publié dans la version 7.82 de cURL en mars 2022 ; assurez-vous donc d’avoir la dernière version de cURL installée avant de l’utiliser.

Envoyer des données XML

cURL vous permet également d’envoyer des données dans d’autres formats, tels que XML. Pour envoyer des données XML, vous devez définir votre en-tête Content-Type sur application/xml et transmettre les données XML dans le corps de la requête à l’aide de l’option -d. Vous pouvez également indiquer au serveur web que vous vous attendez à ce que la réponse soit en XML en définissant l’en-tête Accept sur application/xml.

La commande suivante montre comment envoyer un objet XML dans une requête POST à l’aide de cURL :

curl -X POST -H 'Content-Type: application/xml' -H 'Accept: application/xml' -d '<Person>
    <FirstName>Joe</FirstName>
    <LastName>Soap</LastName>
</Person>' https://httpbin.org/anything

Vous trouverez les données de requête XML dans la propriété data renvoyée par httpbin.org :

{
  "args": {},
  "data": "<Person>\n    <FirstName>Joe</FirstName>\n    <LastName>Soap</LastName>\n</Person>",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/xml",
    "Content-Length": "79",
    "Content-Type": "application/xml",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}
Envoyer des données FormData

Vous pouvez utiliser FormData pour envoyer des paires de données clé-valeur à un serveur web. Comme son nom l’indique, vous utilisez ce format de données lorsque vous soumettez un formulaire sur une page web. Les paires clé-valeur ont un nom de champ et une valeur.

cURL vous permet de spécifier FormData à l’aide de l’indicateur -F ou --form. Lorsque vous utilisez l’indicateur, spécifiez le nom et la valeur du champ au format suivant : -F <name=content> ou --form <name=content>.

Le code suivant présente une commande cURL qui envoie une requête POST à l’aide de données FormData avec des champs FirstName et LastName :

curl -X POST -F FirstName=Joe -F LastName=Soap https://httpbin.org/anything

Vous trouverez les noms et les valeurs des champs du formulaire dans la propriété form de l’objet réponse httpbin.org :

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "248",
    "Content-Type": "multipart/form-data; boundary=------------------------e2bb56049a60b8b8",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Vous utilisez l’indicateur -F pour chaque champ que vous souhaitez envoyer au serveur.

Charger des fichiers

Vous pouvez utiliser FormData pour charger un fichier dans une requête POST en joignant le fichier à un champ. Pour informer cURL qu’un champ FormData contient un fichier, entrez le chemin d’accès au fichier dans la valeur du champ, précédé du caractère @.

La commande cURL suivante permet de télécharger un fichier appelé Contract.pdf dans votre répertoire de travail. La commande utilise un champ appelé File pour charger le fichier :

curl -X POST -F [email protected] https://httpbin.org/anything

La réponse contient tout le fichier ; elle est donc longue, mais devrait ressembler à ceci :

{
  "args": {},
  "data": "",
  "files": {
    "File": "..."
  },
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "246",
    "Content-Type": "multipart/form-data; boundary=------------------------19ed1fc3be4d30c7",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Envoyer des informations d’identification

De nombreux points de terminaison HTTP nécessitent une authentification pour envoyer des requêtes. Le serveur web décide quelle méthode d’authentification vous devez utiliser. Le schéma d’authentification de base est une méthode d’authentification possible ; il vous permet d’envoyer des informations d’identification consistant en un nom d’utilisateur et un mot de passe dans votre requête. Le serveur vérifie ensuite les informations d’identification et, si elles sont correctes, traite la requête.

cURL simplifie l’envoi d’informations d’authentification de base à l’aide de l’indicateur -u ou --user. Vous spécifiez ensuite le nom d’utilisateur et le mot de passe en les séparant par le signe : (deux points), comme ceci : -u <username:password>.

L’extrait suivant utilise cURL pour envoyer une requête POST avec les informations d’identification de l’utilisateur et un corps JSON :

curl -X POST -u 'admin:password123' --json '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Remarquez comment cURL code le nom d’utilisateur et le mot de passe, et les envoie dans l’en-tête Authorization :

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Authorization": "Basic YWRtaW46cGFzc3dvcmQxMjM=",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Conclusion

Cet article vous a montré comment envoyer des requêtes POST à l’aide de l’utilitaire de ligne de commande cURL. Vous avez appris à utiliser l’option -X pour indiquer que vous souhaitez envoyer une requête POST. Vous définissez également les en-têtes Content-Type et Accept en utilisant les options -H et --header afin que le serveur web sache dans quel format se trouvent les données. Pour envoyer des données dans le corps de la requête, vous avez utilisé l’indicateur -d avec les données que vous vouliez envoyer.

Vous avez également vu des exemples d’envoi de différents types de données, à savoir JSON, XML et FormData, et vous avez appris à envoyer des informations d’authentification de base dans votre requête à l’aide des indicateurs -u et --user.

Cet article présente les indicateurs de base inclus dans cURL et la manière de les utiliser ; cela étant, cURL fournit encore d’autres fonctionnalités que vous souhaiterez peut-être découvrir, notamment l’utilisation de variables, l’envoi de cookies avec des requêtes et l’envoi de requêtes à l’aide d’un proxy. De nombreux langages de programmation fournissent également des bibliothèques qui vous permettent de travailler avec cURL dans le langage considéré, notamment Python, Node.js et Rust.

Vous cherchez une solution de web scraping ? Adressez-vous à l’un de nos experts en données pour découvrir lequel de nos produits répond le mieux à vos besoins.