HTTP Request
-
Hi!
Ich suche eine Lib für C++, bei der ich optimalerweise(!) eine Funktion hätte, mit der ich eine Webseite eingebe, und deren Quelltext als String zurückbekomme.
Gibt es sowas? Optimal wäre sowas:
string quelltext = getquelltext("http://www.c-plusplus.net/forum/");
-
Dafür brauchst du keine extra Bibliothek. Wenn du per Socket eine Anfrage an einen Webserverstellst, dann bekommst du als Antwort ganz automatisch den HTML Quelltext der Seite geliefert. In C wird die Antwort klassischerweise in einen Puffer-Array geschrieben. Du könntest das natürlich auch in einen String schreiben.
-
libcurl zum Beispiel. Es gibt sogar C++-Bindings auf der Seite, wenn du kein C haben willst.
-
Dann muss ich mich aber erst in Sockets einarbeiten. Da würde mir eine kleine Lib besser gefallen. Ein Aufruf und die Sache ist getan. Denn ich denke, bis ich das mit Sockets geschnallt habe...
-
Berufspenner schrieb:
Dafür brauchst du keine extra Bibliothek. Wenn du per Socket eine Anfrage an einen Webserverstellst, dann bekommst du als Antwort ganz automatisch den HTML Quelltext der Seite geliefert. In C wird die Antwort klassischerweise in einen Puffer-Array geschrieben. Du könntest das natürlich auch in einen String schreiben.
Ganz so einfach ist's nicht. Du musst den Server auch noch ganz lieb fragen:
GET /forum HTTP/1.1
Host: www.c-plusplus.net
-
.filmor schrieb:
Berufspenner schrieb:
Dafür brauchst du keine extra Bibliothek. Wenn du per Socket eine Anfrage an einen Webserverstellst, dann bekommst du als Antwort ganz automatisch den HTML Quelltext der Seite geliefert. In C wird die Antwort klassischerweise in einen Puffer-Array geschrieben. Du könntest das natürlich auch in einen String schreiben.
Ganz so einfach ist's nicht. Du musst den Server auch noch ganz lieb fragen:
GET /forum HTTP/1.1
Host: www.c-plusplus.netDas war bzw. ist mir schon klar
Natürlich ist da vorher noch einiges zu tun.@edii
Um überhaupt eine Antwort von einem Webserver zu bekommen, musst du ihn vorher erstmal ansprechen und bis du überhaupt dazu kommst wirst du noch einiges in deinem Programm machen müssen. Schließlich musst du ja erstmal eine Verbindung aufbauen, etc. pp. und dafür wirst du an Sockets oder ähnlichem nicht vorbei kommen. Selbst libcurl will noch etwas Vorarbeit.
-
libcurl sieht vernünfigt aus, aber fast schon zu umfangreich.
Im Manual stehen viele Dinge, einfache Programme. Aber wie finde ich heraus, wo steht, wie man den Quelltext einer Seite bekommt?Ich mein, sowas sieht ja toll aus, aber es steht nicht wirklich dabei, was es macht...außer "getinfo".
/***************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * $Id: getinfo.c,v 1.2 2004/11/22 16:24:46 bagder Exp $ */ #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; /* http://curl.haxx.se/libcurl/c/curl_easy_init.html */ curl = curl_easy_init(); if(curl) { /* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTURL */ curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); /* http://curl.haxx.se/libcurl/c/curl_easy_perform.html */ res = curl_easy_perform(curl); if(CURLE_OK == res) { char *ct; /* ask for the content-type */ /* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct); if((CURLE_OK == res) && ct) printf("We received Content-Type: %s\n", ct); } /* always cleanup */ /* http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html */ curl_easy_cleanup(curl); } return 0; }
-
Erwarte hier kein Fastfood. Du musst dich da einarbeiten.
-
sieht wohl so aus.
Danke, wenigstens bin ich schon mal bei cURL, werde das schon herbekommen. CU
-
Standardmäßig schreibt das Ding in stdout, aber hier wird erklärt, wie du das änderst. Deine geforderte Funktion sähe mit libcurl also in etwa so aus:
#include <string> #include <stdexcept> #include <curl/curl.h> namespace { size_t write_to_string (void *buffer, size_t size, size_t nmemb, void *userp) { // möglicherweise auch nmemb statt size, ich mach nicht so viel C ;) std::string result (reinterpret_cast<const char*>(buffer), size); reinterpret_cast<std::string*>(userp)->append(result); return size; } } std::string getquelltext (std::string const& url) { CURL *curl; CURLcode res; std::string out; curl = curl_easy_init(); if (!curl) throw std::runtime_error("CURL kaputt"); curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_to_string); curl_easy_setopt(curl, CURLOPT_WRITEDATA, reinterpret_cast<void*>(&out)); res = curl_easy_perform(curl); if(res != CURLE_OK) throw std::runtime_error("Ne, dat hat nicht geklappt."); curl_easy_cleanup(curl); return out; }/edit: Na toll, Penner, jetzt hast du ihn verscheucht. Und wer soll jetzt meinen Code testen?!
-
.filmor schrieb:
/edit: Na toll, Penner, jetzt hast du ihn verscheucht. Und wer soll jetzt meinen Code testen?!
Tja, das wirst du wohl auch selber machen müssen ;)...mein Gott, warum sind denn hier immer alle so faul und wollen, dass andere ihre Arbeit machen?!

-
keine angst, ich bin noch da...
Schau mir jetzt dein Zeug an, geb auch Rückmeldung wenn ich was hab
-
Unter Windows kann man, der WinAPI sei dank, auch einfach "URLDownloadToFile" aufrufen

-
Mist, ich scheine Linkerfehler zu haben.
Benutze Visual Studio, habe in den Include Ordner den ordner curl reingetan, indem sich curl.h befindet, das sollte passen. Aber wie linke ich richtig in visual studio?Projekt-Eigenschaften-Linker...oder bin ich da falsch?
Meine Fehler sind:
Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_cleanup" in Funktion ""class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getquelltext(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?getquelltext@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z)". main.obj Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_perform" in Funktion ""class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getquelltext(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?getquelltext@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z)". main.obj Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_setopt" in Funktion ""class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getquelltext(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?getquelltext@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z)". main.obj Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__curl_easy_init" in Funktion ""class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getquelltext(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?getquelltext@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z)". main.obj Fehler 5 fatal error LNK1120: 4 nicht aufgelöste externe Verweise. C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2005\Projects\httprequest\Debug\httprequest.exe 1
-
ich muss ja laut Dokumentation
curl-config --libslinken, aber es fragt mich bei Visual Studio nach .lib Dateien...wo trage ich da so eine Zeile ein?
-
-
Badestrand schrieb:
Unter Windows kann man, der WinAPI sei dank, auch einfach "URLDownloadToFile" aufrufen

und unter Linux "wget"
-
Paul Manns schrieb:
und unter Linux "wget"
Nicht nur unter Linux.
-
wgetter schrieb:
Paul Manns schrieb:
und unter Linux "wget"
Nicht nur unter Linux.
sry

-
ich bekomms ums verrecken nicht her, die kack lib dazuzulinken, so eine scheiße.
-
Hast du dir den Link angesehen?
Dort wird's ziemlich genau beschrieben.