Https Post Request



  • Guten Morgen,

    ich arbeitet momentan an einem kleinen Projekt mit. Dabei werden Daten aus einem Prozess bezogen und derzeitig geloggt. Bis jetzt war das auch ausreichend. Künftig sollen allerdings die Daten über einen https post request an einen URL geschickt werden. Dort werden die Daten dann eingelesen und hübsch in Diagrammen dargestellt. Wie ihr vielleicht wisst, bin ich ja in Sachen C++ ja eigentlich noch Anfänger. Leider soll das Problem aber auf diesem Weg gelöst werden. Nun ist die Frage wie man da am besten vorgeht. Als IDE wird VisualStudio Community 2017 verwendet.

    (kurz zu meiner Vorarbeit:
    ich bin auf viele Beispiele zum Thema gestoßen, welche Boost zur Hilfe nehmen. Boost habe ich auch installiert. Jedoch gibts immer Probleme wenn ich die Boost/Asio verwende. Da steckt bei mir irgendwie der Wurm drin)



  • Ich würde dir dafür nicht zu Boost raten sondern zu libcurl oder dem C++ Wrapper drumrum curlpp

    Mit Boost Asio kannst du dir das HTTP Protokoll im Prinzip selber zusammen basteln, aber das muss ja nicht unbedingt sein.



  • Und deine Frage ist genau was?



  • Meine Frage ist wie oben steht: Wie man da am besten vorgeht. Also ich habe mir jetzt libcurl gedownloaded, Include Verzeichnis hinzugefügt, Lib Verzeichnis hinzugefügt. Beispielprogramm gesucht zum testen. Momentan bekomme ich da diverse Fehler. Ich schau mal obs noch mehr Anleitungen zum installieren gibt 🙂



  • „Wie geht man am Besten vor“ == macht meine arbeit.



  • Nein. Ich möchte nur wissen was für Möglichkeiten es gibt. So wie Schlangenmensch das gemacht hat. Stichwort geben (libcurl/curlpp) und dann versuche ich da was draus zu machen. Wenn ich nicht solche Probleme hätte Librarys lauffähig zu meinen Projekten hinzuzufügen hätte ich vielleicht schon meine Lösung.



  • SFML und Cinder



  • Vielen Dank schon mal für eure Antworten. Also cURL sieht schonmal recht vielversprechend aus. So vielversprechend, dass ich eigentlich den ganzen Tag nichts anderes gemacht habe, als daran zu scheitern es zum laufen zu bekommen. Die Fehler die auftauchen sind immer die gleichen. Und zwar sind alles Linker-Fehler. (LNK2019 -> Details hänge ich an) Das Netz ist voll mit Beiträgen zu dem Fehler. Leider hat bei mir bis jetzt nichts funktioniert. Selbst hier im Forum gibt es Beiträge dazu:
    https://www.c-plusplus.net/forum/321982-full
    https://www.c-plusplus.net/forum/296439-full

    Ich bin zuerst nach folgender Anleitung vorgegangen:
    http://www.codepool.biz/build-use-libcurl-vs2015-windows.html

    Dann habe ich ich im cURL Verzeichnis im Ordner Winbuild eine Anleitung gefunden. Diese ist im großen und ganze ähnlich der des ersten Links. Leider hat auch diese den/die Fehler nicht behoben.

    Naja, dann gabs noch viele weitere Anleitungen im Netz, welche ich ausprobierte, jedoch ohne Erfolg. Nachdem ich direkt nach dem Fehler suchte, fand ich wie schon gesagt viele Beiträge dazu. Folgendes habe ich schon alles ausprobiert:

    #pragma comment(lib, "wldap32.lib" )
    #pragma comment(lib, "crypt32.lib" )
    #pragma comment(lib, "Ws2_32.lib")
    
    #define CURL_STATICLIB 
    #include <curl/curl.h>
    

    (mit eingebunden)

    2. Präprozessordefinition in den Einstellugen hinzugefügt -> CURL_STATICLIB

    3. Andere Präprozessordefinitionen hinzugefügt -> BUILDING_LIBCURL HTTP_ONLY

    4. Zusätzliche Abhängigkeiten von Linker angegeben -> libcurl.lib ws2_32.lib winmm.lib wldap32.lib

    5. Zusätzliche Bibliotheksverzeichnisse hinzugefügt (Immer wieder andere)

    Das waren so die Änderungen, die mir noch so eingefallen sind. Aber es waren viele viele andere Dinge die ich noch gelesen und versucht habe. Auch bei den Linker Abhängigkeiten habe ich viele verschiedene Versionen gefunden. Das Beispiel welches ich zum testen genommen habe kommt aus dem Netz. Mittlerweile habe ich aber in den Samples im cURL Verzeichnis das Beispiel wieder gefunden. Also ich gehe ich mal stark davon aus, dass dieses korrekt ist. Achja, eine libcurl.lib habe ich im im ganzen cURL Verzeichnis gesucht und keine gefunden. Allgemein keine .lib. Viele Beiträge die ich gefunden habe, bezogen sich auch auf ältere VS Versionen. Nun stellt sich mir die Frage: Ist hier jemand im Forum, der unter VS2017 cURL benutzt?

    Linkerfehler:

    1>ConsoleApplication3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_curl_global_init" in Funktion "_main".
    1>ConsoleApplication3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_curl_global_cleanup" in Funktion "_main".
    1>ConsoleApplication3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_curl_easy_strerror" in Funktion "_main".
    1>ConsoleApplication3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_curl_easy_init" in Funktion "_main".
    1>ConsoleApplication3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_curl_easy_setopt" in Funktion "_main".
    1>ConsoleApplication3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_curl_easy_perform" in Funktion "_main".
    1>ConsoleApplication3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_curl_easy_cleanup" in Funktion "_main".
    


  • Wie bist du denn vorgegangen?

    Ich benutze libcurl mit VS2015, prinzipiell sollte das keinen großen Unterschied machen.

    VS2017 entspricht soweit ich weiß vc15, aber es kann sein, dass ich mich mit den Namen des entsprechenden Makefiles trotzdem vertan habe.

    So sollte es gehen:

    Schritt 1: Download und entpacken des Archives.
    Schritt 2: Passe das entsprechende Makefile (Makefile.vc15 im Unterordner lib) so an, dass die Pfade auf die richtigen Pfade bei dir Zeigen (z.B., Openssl etc), das hängt ein bisschen davon ab, was libcurl unterstützen soll. Bei mir waren das, Openssl, zlib, windows-sdk.
    Schritt 3: Führe Makefile aus. Also z.B. aus der der VS Command Prompt: nmake /f makefile.vc15 CFG="release-ssl-ssh2-zlib" (hängt davon ab in welcher Konfiguration du libcurl kompilieren möchtest.

    Schritt 4: Sage deinem VS Projekt, wo die libcurl Dateien zu finden sind:
    - Compiler: Include Ordner
    - Linker: Lib Ornder, Bibliothek (libcurl.lib)
    - Präprozessordefinition: CURL_STATICLIB



  • Vielen Vielen Vielen Dank!

    Ich weiß nicht ob es an den vielen Lösungsmaßnahmen gestern lag oder an sonst was. Es funktioniert jetzt. Ich nutze gleich mal die Gelegenheit um hier ein ordentliches Tutorial für Anfänger zu machen.

    1. LibcURL downloaden und entpacken (https://curl.haxx.se/download.html)

    2. VS Command Prompt öffnen. Wer nicht weiß wo es liegt, kann bei Windows beim Startmenü nach dem Programm suchen. Eigentlich reicht es wenn man dort Prompt eingibt. Dort öffnet man dann "Developer Command Prompt for VS 2017".

    3. Ihr navigiert dann zu eurem Dateipfad wo cURL liegt und dort in das Winbuild Verzeichnis. Das schreibt ihr sozusagen so in das Konsolenfenster: cd C:\Program Files (x86)\Microsoft Visual Studio\cURL\curl-7.57.0\winbuild

    (Natürlich ändert ihr den Pfad, wenn es bei euch ein anderer ist)

    4. Schreibt nun folgendes ins Konsolenfenster: Set RTLIBCFG=static

    5. Dannach dann nmake /f Makefile.vc mode=static VC=14 MACHINE=x64 DEBUG=no

    Ihr könnt das alles nach euren Wünschen anpassen:

    where <options> is one or many of:
      VC=<6,7,8,9,10,11,12,14>     - VC versions
      WITH_DEVEL=<path>            - Paths for the development files (SSL, zlib, etc.)
                                     Defaults to sibbling directory deps: ../deps
                                     Libraries can be fetched at http://windows.php.net/downloads/php-sdk/deps/
                                     Uncompress them into the deps folder.
      WITH_SSL=<dll or static>     - Enable OpenSSL support, DLL or static
      WITH_NGHTTP2=<dll or static> - Enable HTTP/2 support, DLL or static
      WITH_MBEDTLS=<dll or static> - Enable mbedTLS support, DLL or static
      WITH_CARES=<dll or static>   - Enable c-ares support, DLL or static
      WITH_ZLIB=<dll or static>    - Enable zlib support, DLL or static
      WITH_SSH2=<dll or static>    - Enable libSSH2 support, DLL or static
      ENABLE_SSPI=<yes or no>      - Enable SSPI support, defaults to yes
      ENABLE_IPV6=<yes or no>      - Enable IPv6, defaults to yes
      ENABLE_IDN=<yes or no>       - Enable use of Windows IDN APIs, defaults to yes
                                     Requires Windows Vista or later, or installation from:
                                     https://www.microsoft.com/downloads/details.aspx?FamilyID=AD6158D7-DDBA-416A-9109-07607425A815
      ENABLE_WINSSL=<yes or no>    - Enable native Windows SSL support, defaults to yes
      GEN_PDB=<yes or no>          - Generate Program Database (debug symbols for release build)
      DEBUG=<yes or no>            - Debug builds
      MACHINE=<x86 or x64>         - Target architecture (default is x86)
    

    6. Im cURL Verzeichnis gibt es einen Ordner mit dem Namen builds. Dort sind nun verschiedene Ordner angelegt wurden. In mindestens einem davon solltet ihr die Ordner bin, include und lib vorfinden. Öffnet nun euer VisualStudio.

    7. Öffnet ein bestehendes Projekt oder erstellt ein neues.

    8. Klickt im Projektmappenexplorer auf euer Projekt mit der rechten Maustaste und wählt Eigenschaften.

    9. Unter Konfigurationseigenschaften -> C/C++ -> Allgemein und dort bei Zusätzliche Includeverzeichnisse wählt ihr jetzt den oben genannten Include-Ordner aus dem build-Verzeichnis aus.

    10. Unter Konfigurationseigenschaften -> Linker -> Allgemein und dort bei Zusätzliche Bibliotheksverzeichnisse wählt ihr jetzt den oben genannten Lib-Ordner aus dem build-Verzeichnis aus.

    11. Unter Konfigurationseigenschaften -> Linker -> Eingabe und dort bei Zusätzliche Abhängigkeiten schreibt ihr den Dateiname der .lib Datei rein welche im build/lib Ordner liegt. Bei mir ist das die libcurl_a.lib

    12. Unter Konfigurationseigenschaften -> C/C++ -> Präprozessor und dort bei Präprozessordefinitionen schreibt ihr die CURL_STATICLIB mit dazu. (Wenn dort bei euch nichts drin steht schreibt ihr einfach nur die CURL_STATICLIB rein.

    Hier nun ein Beispiel welches bei mir funktioniert hat:

    #include <stdio.h>
    #include <curl/curl.h>
    
    int main(void)
    {
    	CURL *curl;
    	CURLcode res;
    
    	/* In windows, this will init the winsock stuff */
    	curl_global_init(CURL_GLOBAL_ALL);
    
    	/* get a curl handle */
    	curl = curl_easy_init();
    	if (curl) {
    		/* First set the URL that is about to receive our POST. This URL can
    		just as well be a https:// URL if that is what should receive the
    		data. */
    		curl_easy_setopt(curl, CURLOPT_URL, "https://requestb.in/1grcw7l1");
    		/* Now specify the POST data */
    		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
    
    		/* Perform the request, res will get the return code */
    		res = curl_easy_perform(curl);
    		/* Check for errors */
    		if (res != CURLE_OK)
    			fprintf(stderr, "curl_easy_perform() failed: %s\n",
    				curl_easy_strerror(res));
    
    		/* always cleanup */
    		curl_easy_cleanup(curl);
    	}
    	curl_global_cleanup();
    	return 0;
    }
    

    Bei requestb.in könnt ihr eure HTTP Requests testen. Einfach dort Link erstellen lassen, in das oben geschriebene Schnipsel kopieren und schauen ob es funktioniert.

    Viel Spaß dabei 😃 👍



  • Sauber 👍
    Gefällt mir, dass du das so ausführlich dokumentierst.



  • Ja na klar. Sonst steht der nächste bald mit dem gleichen Problem da. Schade nur, dass man immer gleich mit "macht meine Arbeit" abgestempelt wird. Aber ich kanns verstehen. Habe schon einige Beiträge hier von "faulen" Leuten gelesen. Manchmal ist es aber auch als Anfänger schwer seine Frage zu formulieren oder man braucht mal nen Anhaltspunkt wenn man gar keine Ahnung hat wo man anfangen soll. (So wie bei meiner Frage hier)



  • Ich muss hier mal noch nen kleinen Nachtrag schreiben. Wenn ihr cURL in einem 64 Bit Projekt nutzen wollt, müsst ihr natürlich x64 Native Tools Command Prompt for VS 2017 nutzen zum bauen. Ihr habt sonst in den include/lib/bin Verzichnis nichts drin liegen


Log in to reply