HTTP-Anfragen mit curl in C++ senden inklusive Installation der Library

C++ bietet keine eingebaute Bibliothek für HTTP-Anfragen, wie C# mit der WebClient bzw. HttpWebRequest Klasse. Statt das Protokoll selbst mit Sockets zu implementieren, stehen jedoch andere Bibliotheken zur Verfügung. Eine der verbreitetsten ist curl, bekannt durch das gleichnamige Kommandozeilenwerkzeug. Es wird jedoch auch eine C-Bibliothek angeboten. Zunächst müssen wir diese installieren, unter Debian/Ubuntu via apt-get Paketverwaltung:

sudo apt-get install libcurl4-openssl-dev

Der gcc Compiler ist unter vielen Distributionen bereits installiert. Falls nicht, kann er in der Regel über das gleichnamige Paket nachinstalliert werden. Als Beispiel dient folgender C++ Code. Er führt eine HTTP GET Anfragen an example.com mittels der curl Bibliothek durch. Im Anschluss wird der HTML Body zusammen mit den Antwortheadern des Webservers auf der Konsole ausgegeben:

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

using namespace std;

size_t writeFunction(void* ptr, size_t size, size_t nmemb, std::string* data) {
    data->append((char*)ptr, size * nmemb);
    return size * nmemb;
}

int main(int argc, char** argv) {
    curl_global_init(CURL_GLOBAL_DEFAULT);
    auto curl = curl_easy_init();
    string url = "http://example.com/";
    if(!curl) {
        printf("Initialisierung von curl fehlgeschlagen!");
        return 1;
    }

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
    curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);

    std::string response_string;
    std::string header_string;
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, &header_string);

    curl_easy_perform(curl);
    cout << response_string << "\n\n" << header_string;

    curl_easy_cleanup(curl);
    curl_global_cleanup();
    curl = NULL;  
    return 0;
}

Den Code müssen wir nun kompilieren sowie mit der curl/Standard C++ Bibliothek linken. Anschließend kann man die erzeugte Binary ausführen. Sie sollte uns den HTML Quelltext der GET-Anfrage auf example.com ausgeben, sowie anschließend den HTTP Antwortheader:

$ gcc curl.cc -lcurl -lstdc++ -o curl.run && ./curl.run
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
...
HTTP/1.1 200 OK
Age: 420631
Cache-Control: max-age=604800
...

Leave a Reply