Introduction : pourquoi écrire un client HTTP en C++ ?
Dans le développement moderne, l'interaction avec les services web est devenue une partie intégrante de presque toutes les applications. Même si vous écrivez un programme de bureau en C++, tôt ou tard, vous aurez besoin d'envoyer des données à un serveur ou d'en recevoir. Contrairement aux langages de script, le C++ ne dispose pas d'outils intégrés pour travailler avec HTTP — mais ce n'est pas un problème. Il existe plusieurs méthodes éprouvées pour implémenter un client HTTP en C++, et nous allons les aborder du plus simple au plus complexe.
Dans cet article, nous allons voir :
- Comment utiliser la bibliothèque libcurl — la référence pour travailler avec HTTP en C++
- Comment envoyer des requêtes GET et POST avec des en-têtes et un corps
- Comment traiter la réponse reçue et analyser du JSON
- Comment éviter les erreurs typiques lors du travail avec des requêtes réseau
Tous les exemples de code peuvent être utilisés immédiatement dans vos projets. C'est parti !
1. Choix de la bibliothèque : libcurl comme outil principal
Écrire un client HTTP en C++ à partir de zéro est une tâche ingrate. Vous devrez travailler avec des sockets, formater manuellement les en-têtes, analyser les réponses et gérer une multitude de cas particuliers. Heureusement, il existe libcurl — une bibliothèque puissante, stable et multiplateforme qui fait tout le travail ingrat à votre place.
Pour commencer, installez libcurl. Sur Ubuntu, cela se fait avec une seule commande :
sudo apt-get install libcurl4-openssl-devSur Windows, vous pouvez utiliser vcpkg ou télécharger des binaires prêts à l'emploi. Après l'installation, liez la bibliothèque dans votre CMakeLists.txt ou liez-la manuellement avec les flags -lcurl.
La structure de base du travail avec libcurl est toujours la même :
- Initialiser le contexte global avec l'appel
curl_global_init() - Créer un descripteur de session avec
curl_easy_init() - Définir les paramètres de la requête (URL, en-têtes, méthode, etc.)
- Exécuter la requête avec
curl_easy_perform() - Libérer les ressources
Cela semble simple ? Passons au code.
2. Envoi de requêtes GET et POST : exemples pratiques
2.1 Requête GET simple
Commençons par un classique — récupérons des données depuis une API publique. Supposons que nous voulions connaître le cours actuel du Bitcoin par rapport au dollar :
#include <iostream>#include <string>#include <curl/curl.h>
// Fonction de callback pour écrire les données dans une chaînestatic size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb;}
int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl_easy_init(); std::string response; if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://api.coindesk.com/v1/bpi/currentprice.json"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { std::cerr << "Erreur : " << curl_easy_strerror(res) << std::endl; } else { std::cout << "Réponse du serveur :" << response << std::endl; } curl_easy_cleanup(curl); } curl_global_cleanup(); return 0;}Notez la fonction de callback WriteCallback. libcurl ne sait pas où sauvegarder les données, nous passons donc un pointeur vers une chaîne et y écrivons au fur et à mesure de l'arrivée des données. C'est un modèle standard.
2.2 Requête POST avec un corps JSON
Maintenant, envoyons des données au serveur. Supposons que nous enregistrions un utilisateur :
#include <iostream>#include <string>#include <curl/curl.h>
int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl