[C++] Simple libcurl Wrapperklassen

02/01/2014 20:50 Delinquenz#1
Hallo,
da curlpp mit der neusten Version der libcurl zickt und ich nur ungern bei den etlichen Webanfragen in meinem Projekt mit Pointern rumhantieren möchte, habe ich mir dafür ein paar Klassen geschrieben, die mir das erleichtern sollen. C++11 wird vorausgesetzt.

Ein simples Beispiel
Code:
#include <iostream>
#include <string>

#include "curl.hpp"

int main()
{
    curl::global::init();

    std::string buffer;
 
    curl::easy request;

    if (!request)
        std::cerr << "Curl could not get initialized." << std::endl;

    request.set_opt(CURLOPT_URL, "http://www.example.com");
    request.set_opt(CURLOPT_WRITEDATA, &buffer);
    request.set_opt(CURLOPT_WRITEFUNCTION, curl::write::to_string);

    if (!request.perform())
        std::cerr << "Error: " << request.get_error() << std::endl;

    std::cout << "Content: " << buffer << std::endl;

    curl::global::cleanup();
}
Insgesamt ist alles ziemlich selbsterklärend. curl::form wird nur für multipart/form-data Requests benötigt. Für normale Post-Requests reicht CURLOPT_POSTFIELDS mit einem String.

Finden tut man [Only registered and activated users can see links. Click Here To Register...].

Ich hoffe auf konstruktive Kritik und Verbesserungsvorschläge.
02/11/2014 14:43 MrSm!th#2
Quote:
Ich bin noch am überlegen, wie ich überprüfe, ob curl_easy_init() erfolgreich war. Ich möchte das möglichst ohne Exceptions lösen und noch weniger möchte ich im Konstruktor eine Exception werfen. Die Klassen sind eher simpel, da sie eigentlich nur für das Projekt vorgesehen waren.
Warum?
02/15/2014 13:16 Delinquenz#3
Quote:
Ich bin noch am überlegen, wie ich überprüfe, ob curl_easy_init() erfolgreich war. Ich möchte das möglichst ohne Exceptions lösen und noch weniger möchte ich im Konstruktor eine Exception werfen. Die Klassen sind eher simpel, da sie eigentlich nur für das Projekt vorgesehen waren.
Weil das in Verbindung mit einer kleinen Wrapperklasse 1.) zu aufwendig ist und 2.) die Fehlerüberprüfung mit get_error() total reicht und den Code minimaler hält, als 15 verschiedene Exceptions fangen zu müssen. Mal schauen, vielleicht ändere ich das noch. Im Moment würde das Ganze einfach zu aufwendig werden für meine kleinen Projekte.

Edit:
Neue Version veröffentlicht.

Changelog:
- Stilistische Anpassungen (maximale Breite 120 Zeichen, etc.)
- Standardkonstruktor für curl::header
- curl::easy:.operator bool() hinzugefügt, um eine Überprüfung von curl_easy_init() zur Verfügung zu stellen
- curl::easy::set_opt<T>(CURLoption, T) hat nun 3 Überladungen für std::string, curl::form und curl::header um das Aufrufen der std::string::c_str(), curl::form::get_form() und curl::header::get_header() Funktionen automatisch zu tätigen.
- Die WRITEFUNCTION curl::write::nowhere gibt es nun, um CLI-Ausgaben zu vermeiden, wenn man ein GET-Request machen möchte, ohne, dass man den Inhalt verarbeiten möchte.

Mal schauen, ob ich das Ganze auf github packe.
03/08/2014 14:09 Delinquenz#4
Habe einiges geändert. Da ich leider noch sehr neu bin, was VCS angeht, sind die Commits nicht wirklich sinnvoll strukturiert und deshalb zu ignorieren :S

Würde gern Feedback hören. Ich schaue die Tage noch, wie ich den = Operator und den Copy-Konstruktor mache (momentan deaktiviert, da kopierte Pointer total sinnlos sind und nur Stress machen würden), Constness anpassen und eventuell Exceptions reinbringen.

Zudem wollte ich fragen, ob ich das Ganze einmal in der C++ Sektion posten darf. Hier wird es vermutlich kaum einer sehen.
03/08/2014 14:22 Mostey#5
Quote:
Originally Posted by Delinquenz View Post
Zudem wollte ich fragen, ob ich das Ganze einmal in der C++ Sektion posten darf. Hier wird es vermutlich kaum einer sehen.
Warum sollte es hier niemand sehen und was macht das für einen Unterschied? Diese Sektion wurde doch extra für so etwas geschaffen, warum also dann woanders posten?
03/08/2014 14:59 Delinquenz#6
Quote:
Warum sollte es hier niemand sehen und was macht das für einen Unterschied? Diese Sektion wurde doch extra für so etwas geschaffen, warum also dann woanders posten?
Weil ich dort vermutlich mehr Feedback kriege und ich somit die Qualität dieser Klassen steigern kann.
03/08/2014 16:04 Mostey#7
Quote:
Originally Posted by Delinquenz View Post
Weil ich dort vermutlich mehr Feedback kriege und ich somit die Qualität dieser Klassen steigern kann.
Kann ich verstehen, das müsste dann aber auch für alle gelten, die hier ihre Klassen posten. Das würde die Sektion wiederum unnötig machen.

Außerdem bin ich mir ziemlich sicher, das hier auch genauso viele Leute reinschauen. Es wird halt nicht viel geschrieben. (Warum sollten die User sich auch zu jedem Snippet / zu jeder Klasse äußern wollen)
03/08/2014 16:23 MrSm!th#8
Quote:
Originally Posted by Delinquenz View Post
Weil das in Verbindung mit einer kleinen Wrapperklasse 1.) zu aufwendig ist und 2.) die Fehlerüberprüfung mit get_error() total reicht und den Code minimaler hält, als 15 verschiedene Exceptions fangen zu müssen. Mal schauen, vielleicht ändere ich das noch. Im Moment würde das Ganze einfach zu aufwendig werden für meine kleinen Projekte.
Was spricht gegen eine Exception, die einen Error-Code enthält?
Du hast Exception-Handling offenbar nicht ganz begriffen. Wenn man 15 verschiedene Exceptions an einer Stelle fangen muss, läuft da in der Regel etwas falsch.
03/09/2014 19:14 Delinquenz#9
Quote:
Was spricht gegen eine Exception, die einen Error-Code enthält?
Wie ich bereits in einem neueren Beitrag schrieb, werde ich wohl Exceptions noch reinbringen.

Quote:
Würde gern Feedback hören. Ich schaue die Tage noch, wie ich den = Operator und den Copy-Konstruktor mache, Constness anpassen und eventuell Exceptions reinbringen.