HTTP-Client in C++: Anfragen richtig stellen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung: Warum einen HTTP-Client in C++ schreiben?

In der modernen Entwicklung ist die Interaktion mit Webdiensten ein integraler Bestandteil fast jeder Anwendung geworden. Selbst wenn Sie ein Desktop-Programm in C++ schreiben, werden Sie früher oder später Daten an einen Server senden oder von dort empfangen müssen. Im Gegensatz zu Skriptsprachen hat C++ keine integrierten Werkzeuge für die Arbeit mit HTTP – aber das ist kein Problem. Es gibt mehrere bewährte Methoden, um einen HTTP-Client in C++ zu implementieren, und wir werden sie von einfach bis komplex betrachten.

In diesem Artikel behandeln wir:

  • Wie man die libcurl-Bibliothek verwendet – den Goldstandard für die Arbeit mit HTTP in C++
  • Wie man GET- und POST-Anfragen mit Headern und Body sendet
  • Wie man die empfangene Antwort verarbeitet und JSON parst
  • Wie man häufige Fehler bei der Arbeit mit Netzwerkanfragen vermeidet

Alle Codebeispiele können sofort in Ihren Projekten verwendet werden. Los geht's!



1. Bibliotheksauswahl: libcurl als Hauptwerkzeug

Einen HTTP-Client in C++ von Grund auf neu zu schreiben, ist eine undankbare Aufgabe. Sie müssten mit Sockets arbeiten, Header manuell erstellen, Antworten parsen und eine Reihe von Randfällen behandeln. Glücklicherweise gibt es libcurl – eine leistungsstarke, stabile und plattformübergreifende Bibliothek, die die ganze Drecksarbeit für Sie erledigt.

Um zu beginnen, installieren Sie libcurl. Unter Ubuntu geht das mit einem Befehl:

sudo apt-get install libcurl4-openssl-dev

Unter Windows können Sie vcpkg verwenden oder vorgefertigte Binärdateien herunterladen. Nach der Installation binden Sie die Bibliothek in Ihrer CMakeLists.txt ein oder linken Sie sie einfach manuell mit den -lcurl-Flags.

Die grundlegende Struktur der Arbeit mit libcurl ist immer dieselbe:

  1. Initialisieren Sie den globalen Kontext durch Aufruf von curl_global_init()
  2. Erstellen Sie einen Session-Handle curl_easy_init()
  3. Setzen Sie Anfrageparameter (URL, Header, Methode usw.)
  4. Führen Sie die Anfrage aus curl_easy_perform()
  5. Räumen Sie Ressourcen auf

Klingt einfach? Kommen wir zum Code.



2. Senden von GET- und POST-Anfragen: Praktische Beispiele

2.1 Einfache GET-Anfrage

Beginnen wir mit einem Klassiker – Daten von einer öffentlichen API abrufen. Angenommen, wir möchten den aktuellen Bitcoin-zu-Dollar-Wechselkurs wissen:

#include <iostream>#include <string>#include <curl/curl.h>

// Callback-Funktion zum Schreiben von Daten in einen Stringstatic 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 << "Fehler: " << curl_easy_strerror(res) << std::endl; } else { std::cout << "Serverantwort:" << response << std::endl; } curl_easy_cleanup(curl); } curl_global_cleanup(); return 0;}

Beachten Sie die Callback-Funktion WriteCallback. libcurl weiß nicht, wo die Daten gespeichert werden sollen, daher übergeben wir einen Zeiger auf einen String und schreiben beim Eintreffen der Daten hinein. Dies ist ein Standardmuster.



2.2 POST-Anfrage mit JSON-Body

Jetzt senden wir Daten an den Server. Angenommen, wir registrieren einen Benutzer:

#include <iostream>#include <string>#include <curl/curl.h>

int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl

Blogs

Buchempfehlungen