HTTP Request



  • 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 --libs
    

    linken, 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.

    http://gnuwin32.sourceforge.net/packages/wget.htm



  • wgetter schrieb:

    Paul Manns schrieb:

    und unter Linux "wget"

    Nicht nur unter Linux.

    http://gnuwin32.sourceforge.net/packages/wget.htm

    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.



  • versuch mal #pragma comment(lib, "xyz.lib") im Quellcode... Also für xyz.lib natürlich den richtigen Namen...

    Alternativ wär es auf der linken seite im "Projektmappen-Explorer" nen rechtsklick auf dein Projekt gewesen und dann hinzufügen etc...

    bb und gl ; )



  • ja, da wirds ziemlich gut beschrieben.

    Allerdings reicht mir ziemlich gut wohl wieder mal nicht:

    Ich hab Alles was drin stand gemacht, außer das mit der .proj datei hab ich nicht verstanden. Die lib hab ich heruntergeladen, aber da steht nur "im Linker dazulinken", was ich nicht verstehe.

    Folgende Errors hab ich momentan.

    Fehler	2	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__CrtDbgReportW" in Funktion ""public: char const & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator[](unsigned int)const " (??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDI@Z)".	main.obj	
    Fehler	3	error LNK2001: Nicht aufgelöstes externes Symbol "__CrtDbgReportW".	libcpmtd.lib	
    Fehler	4	error LNK2001: Nicht aufgelöstes externes Symbol "__CrtDbgReportW".	libcpmtd.lib	
    Fehler	5	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSACleanup@0" in Funktion "_win32_cleanup".	curllib.lib	
    Fehler	6	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSACleanup@0".	curllib.lib	
    Fehler	7	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSAStartup@8" in Funktion "_win32_init".	curllib.lib	
    Fehler	8	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAStartup@8".	curllib.lib	
    Fehler	9	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__closesocket@4".	curllib.lib	
    Fehler	10	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__closesocket@4".	curllib.lib	
    Fehler	11	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__closesocket@4".	curllib.lib	
    Fehler	12	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__closesocket@4" in Funktion "_conn_free".	curllib.lib	
    Fehler	13	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__closesocket@4".	curllib.lib	
    Fehler	14	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__closesocket@4".	curllib.lib	
    Fehler	15	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__closesocket@4".	curllib.lib	
    Fehler	16	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0".	curllib.lib	
    Fehler	17	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0" in Funktion "_ftp_state_use_port".	curllib.lib	
    Fehler	18	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0".	curllib.lib	
    Fehler	19	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0".	curllib.lib	
    Fehler	20	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0".	curllib.lib	
    Fehler	21	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0".	curllib.lib	
    Fehler	22	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0".	curllib.lib	
    Fehler	23	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0".	curllib.lib	
    Fehler	24	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__recv@16" in Funktion "_Curl_getinfo".	curllib.lib	
    Fehler	25	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__recv@16".	curllib.lib	
    Fehler	26	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__inet_ntoa@4" in Funktion "_inet_ntop4".	curllib.lib	
    Fehler	27	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__htons@4" in Funktion "_Curl_he2ai".	curllib.lib	
    Fehler	28	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__htons@4".	curllib.lib	
    Fehler	29	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__htons@4".	curllib.lib	
    Fehler	30	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__gethostbyname@4" in Funktion "_gethostbyname_thread@4".	curllib.lib	
    Fehler	31	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSASetLastError@4" in Funktion "_gethostbyname_thread@4".	curllib.lib	
    Fehler	32	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSASetLastError@4".	curllib.lib	
    Fehler	33	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__socket@12" in Funktion "_init_resolve_thread".	curllib.lib	
    Fehler	34	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__socket@12".	curllib.lib	
    Fehler	35	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__socket@12".	curllib.lib	
    Fehler	36	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__inet_addr@4" in Funktion "_Curl_getaddrinfo".	curllib.lib	
    Fehler	37	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__inet_addr@4".	curllib.lib	
    Fehler	38	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__inet_addr@4".	curllib.lib	
    Fehler	39	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "___WSAFDIsSet@8" in Funktion "_Curl_socket_ready".	curllib.lib	
    Fehler	40	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__select@20" in Funktion "_Curl_socket_ready".	curllib.lib	
    Fehler	41	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__ntohs@4" in Funktion "_Curl_SOCKS4".	curllib.lib	
    Fehler	42	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__ntohs@4".	curllib.lib	
    Fehler	43	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__ntohs@4".	curllib.lib	
    Fehler	44	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__send@16" in Funktion "_Curl_plain_send".	curllib.lib	
    Fehler	45	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__send@16".	curllib.lib	
    Fehler	46	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__ioctlsocket@12" in Funktion "_Curl_nonblock".	curllib.lib	
    Fehler	47	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__getsockname@12" in Funktion "_bindlocal".	curllib.lib	
    Fehler	48	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__getsockname@12".	curllib.lib	
    Fehler	49	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__bind@12" in Funktion "_bindlocal".	curllib.lib	
    Fehler	50	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__bind@12".	curllib.lib	
    Fehler	51	error LNK2001: Nicht aufgelöstes externes Symbol "__imp__bind@12".	curllib.lib	
    Fehler	52	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__getsockopt@20" in Funktion "_verifyconnect".	curllib.lib	
    Fehler	53	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__setsockopt@20" in Funktion "_tcpnodelay".	curllib.lib	
    Fehler	54	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__getprotobyname@4" in Funktion "_tcpnodelay".	curllib.lib	
    Fehler	55	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__connect@12" in Funktion "_singleipconnect".	curllib.lib	
    Fehler	56	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeGetTime@0" in Funktion "_gettimeofday".	curllib.lib	
    Fehler	57	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__accept@12" in Funktion "_AllowServerConnect".	curllib.lib	
    Fehler	58	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__listen@8" in Funktion "_ftp_state_use_port".	curllib.lib	
    Fehler	59	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__sendto@24" in Funktion "_tftp_rx".	curllib.lib	
    Fehler	60	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__recvfrom@24" in Funktion "_Curl_tftp".	curllib.lib	
    Fehler	61	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__malloc_dbg" in Funktion ""void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z)".	libcpmtd.lib	
    Fehler	62	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__free_dbg" in Funktion ""void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z)".	libcpmtd.lib	
    Fehler	63	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__calloc_dbg" in Funktion "__Getctype".	libcpmtd.lib	
    Fehler	64	fatal error LNK1120: 31 nicht aufgelöste externe Verweise.	C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2005\Projects\httprequest\Debug\httprequest.exe
    


  • In the linker section add curllib.lib, ws2_32.lib, winmm.lib

    sprich: in deinen compileroptionen.



  • edii schrieb:

    ich bekomms ums verrecken nicht her, die kack lib dazuzulinken, so eine scheiße.

    Mir geht es ähnlich.
    Erhalte auch:
    https.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__curl_easy_cleanup
    https.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__curl_easy_perform
    https.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__curl_easy_setopt
    https.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__curl_easy_init

    Habe schon #pragma comment(lib,"curllib.lib")
    und #define CURL_STATICLIB usw.
    ausprobiert und bei den Projekteinstellungen curllib.lib ws2_32.lib winmm.lib addiert, aber es will einfach nicht 😞



  • Es gibt da noch ne alternative zu libcurl, die nur den quelltext einer URL downloaded. nennt sich URLDownloadToFile().

    Hier ein beispiel:

    #include <Urlmon.h>
    
    #pragma comment(lib,"Urlmon.lib")
    
    #ifdef __cplusplus
    extern "C" {
    #endif 
    
    std::string adress = "www.google.at";
    std::string file = "derquellcode.txt";
    HRESULT res = 0;
    
    URLDownloadToFile(NULL, reinterpret_cast<LPCSTR>(adress.c_str()), reinterpret_cast<LPCSTR>(file.c_str()), NULL, NULL);
    
    return res;
    };
    
    #ifdef __cplusplus
    }
    #endif
    

Anmelden zum Antworten