HTTP-Client in C++: Anfragen richtig von A bis Z stellen
\n\nIn der modernen Softwareentwicklung ist die Fähigkeit, über HTTP mit entfernten Servern zu interagieren, eine grundlegende Fertigkeit. Ob es um das Herunterladen von Daten von einer API, das Senden von Formularen oder die Arbeit mit Webdiensten geht – C++ bietet mehrere leistungsstarke Werkzeuge zur Erstellung von HTTP-Clients. In diesem Artikel werden wir uns ansehen, wie man HTTP-Anfragen in C++ richtig stellt, beliebte Bibliotheken betrachten und funktionierende Codebeispiele schreiben.
\n\nWarum C++ für HTTP-Anfragen?
\n\nC++ hat im Gegensatz zu Python oder JavaScript keine integrierte HTTP-Unterstützung in der Standardbibliothek. Dies ist jedoch kein Problem: Es gibt bewährte Bibliotheken, die das einfache und effiziente Senden von Anfragen ermöglichen. Die wichtigsten Optionen sind:
\n\n- \n
- libcurl (cURL) – die beliebteste plattformübergreifende Bibliothek. \n
- Boost.Beast – eine moderne Bibliothek basierend auf Boost.Asio. \n
- WinHTTP – eine integrierte Lösung für Windows. \n
- Qt Network – für Projekte mit Qt. \n
In diesem Artikel konzentrieren wir uns auf die ersten beiden, da sie am vielseitigsten sind und für die meisten Aufgaben geeignet sind.
\n\n1. HTTP-Client mit libcurl
\n\nlibcurl ist eine seit Jahren bewährte Bibliothek, die HTTP, HTTPS, FTP und viele andere Protokolle unterstützt. Sie ist einfach zu bedienen und hervorragend dokumentiert.
\n\nInstallation von libcurl
\n\nFür Linux (Ubuntu/Debian):
\nsudo apt-get install libcurl4-openssl-dev\n\nFür Windows können Sie vorkompilierte Binärdateien von der offiziellen Website curl.se herunterladen oder vcpkg verwenden:
\nvcpkg install curl\n\nEinfache GET-Anfrage
\n\nSchreiben wir ein einfaches Beispiel zum Abrufen von Daten von einem Server:
\n\n#include <iostream>\n#include <string>\n#include <curl/curl.h>\n\n// Callback-Funktion zum Schreiben von Daten\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 << "Fehler bei der CURL-Initialisierung" << 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); // SSL-Prüfung für Test deaktivieren\n\n CURLcode res = curl_easy_perform(curl);\n if (res != CURLE_OK) {\n std::cerr << "Anfragefehler: " << curl_easy_strerror(res) << std::endl;\n } else {\n std::cout << "Serverantwort:\\n" << response << std::endl;\n }\n\n curl_easy_cleanup(curl);\n return 0;\n}\n\nKompilieren Sie mit dem Flag -lcurl:
g++ -o http_client http_client.cpp -lcurl\n\nPOST-Anfrage mit JSON-Sendung
\n\nJetzt fügen wir das Senden von Daten hinzu:
\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