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 .
Ich hoffe auf konstruktive Kritik und Verbesserungsvorschläge.
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.
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.
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.
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?
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.
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)
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.
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.
C++ Programm geht auf Vista nicht und Libcurl einbinden? 08/23/2012 - C/C++ - 2 Replies Hallo.
Ich würde gerne einen kleinen Updater als Win32 ANwedung programmieren mit der curl lib.
Hat jemand Beispiele, welche funktionieren.
Danke im Vorraus
Cr41s3
Libcurl Schaltflächen 12/08/2009 - General Coding - 9 Replies Hi,
ich habe gerade angefangen mich mit libcurl zu beschäftigen und hab gleich eine grundlegende Frage und zwar wie kann ich mich auf einer Website bewegen?
mit
int main(void)
{
CURL *curl;
CURLcode res;