Client HTTP en C++ : faire des requêtes correctement

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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-dev

Sur 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 :

  1. Initialiser le contexte global avec l'appel curl_global_init()
  2. Créer un descripteur de session avec curl_easy_init()
  3. Définir les paramètres de la requête (URL, en-têtes, méthode, etc.)
  4. Exécuter la requête avec curl_easy_perform()
  5. 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

Blogs

Book Recommendations