Client HTTP en C++ : faire des requêtes correctement de A à Z
\n\nDans le monde moderne du développement logiciel, savoir interagir avec des serveurs distants via HTTP est une compétence de base. Qu'il s'agisse de télécharger des données depuis une API, d'envoyer des formulaires ou de travailler avec des services web, C++ offre plusieurs outils puissants pour créer des clients HTTP. Dans cet article, nous allons voir comment effectuer correctement des requêtes HTTP en C++, examiner les bibliothèques populaires et écrire des exemples de code fonctionnels.
\n\nPourquoi C++ pour les requêtes HTTP ?
\n\nC++ ne dispose pas de support HTTP intégré dans sa bibliothèque standard, contrairement à Python ou JavaScript. Cependant, ce n'est pas un problème : il existe des bibliothèques éprouvées qui permettent d'envoyer des requêtes facilement et efficacement. Les principales options sont :
\n\n- \n
- libcurl (cURL) — la bibliothèque multiplateforme la plus populaire. \n
- Boost.Beast — une bibliothèque moderne basée sur Boost.Asio. \n
- WinHTTP — une solution intégrée pour Windows. \n
- Qt Network — pour les projets basés sur Qt. \n
Dans cet article, nous nous concentrerons sur les deux premières, car elles sont les plus polyvalentes et conviennent à la plupart des tâches.
\n\n1. Client HTTP avec libcurl
\n\nlibcurl est une bibliothèque éprouvée qui prend en charge HTTP, HTTPS, FTP et de nombreux autres protocoles. Elle est simple à utiliser et bien documentée.
\n\nInstallation de libcurl
\n\nPour Linux (Ubuntu/Debian) :
\nsudo apt-get install libcurl4-openssl-dev\n\nPour Windows, vous pouvez télécharger les binaires précompilés depuis le site officiel curl.se ou utiliser vcpkg :
\nvcpkg install curl\n\nRequête GET simple
\n\nÉcrivons un exemple de base pour récupérer des données depuis un serveur :
\n\n#include <iostream>\n#include <string>\n#include <curl/curl.h>\n\n// Fonction de rappel pour écrire les données\nstatic size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {\n size_t totalSize = size * nmemb;\n output->append((char*)contents, totalSize);\n return totalSize;\n}\n\nint main() {\n CURL* curl = curl_easy_init();\n if (!curl) {\n std::cerr << "Erreur d'initialisation CURL" << std::endl;\n return 1;\n }\n\n std::string response;\n curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1");\n curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);\n curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);\n curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // Désactive la vérification SSL pour le test\n\n CURLcode res = curl_easy_perform(curl);\n if (res != CURLE_OK) {\n std::cerr << "Erreur de requête : " << curl_easy_strerror(res) << std::endl;\n } else {\n std::cout << "Réponse du serveur :\\n" << response << std::endl;\n }\n\n curl_easy_cleanup(curl);\n return 0;\n}\n\nCompilez avec le drapeau -lcurl :
g++ -o http_client http_client.cpp -lcurl\n\nRequête POST avec envoi de JSON
\n\nAjoutons maintenant l'envoi de données :
\n\n#include <iostream>\n#include <string>\n#include <curl/curl.h>\n\nint main() {\n CURL* curl = curl_easy_init();\n if (!curl) return 1;\n\n std::string response;\n std::string jsonData = R"({"title": "foo", "body": "bar", "userId": 1})";\n\n struct curl_slist* headers = nullptr;\n headers = curl_slist_append(headers, "Content-Type: application/json");\n\n curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");\n curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str());\n curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\n curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCal