Eine Verbindung zur einer MySQL Datenbank sicher herstellen?



  • Erstmal Glückwunsch für deinen ersten erfolgreichen HTTP Request mit curl.

    @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Die Sprache ist nicht das Problem sondern die Tatsache,
    das die Grundlagen keines dieser Themen abdeckt, Gute Bücher nur im Englischen gibt, und es in jeder Sprache gleich beigebracht wird. Was sind Strings, was sind Arrays, der ganze kram halt.

    Das Problem ist halt, das Netzwerk Kram nicht geeignet für Programmiergrundlagen ist. Du hantierst jeweils mit verschiedenen Protokollen, die du je nach dem kennen / können musst. Du kommunizierst mit einer anderen Instanz, die musst du aufsetzen und laufen haben. Außerdem müssen Grundlagen wie Datenstrukturen und Kontrollstrukturen schon vorhanden sein.

    Und, C++ ist für so was, gerade wenn es auch um ein schnelles Erfolgserlebnis geht, erstmal undankbar, da es keine Bordmittel mitbringt, die das für dich abstrahieren. Daher bist du dann auf Libraries angewiesen, die das für dich übernehmen oder musst alles selbst machen.

    Bei dir habe ich gerade das Gefühl, dass es nicht nur an C++ liegt, sondern auch das Verständnis fehlt, wie HTTP funktioniert.

    Du kannst z.B. mit curl einen http post request an deine php Seite schicken. Die php Seite meldet sich an der mySQL Datenbank an und macht die Abfrage, die du über den Post spezifiziert hast. Anschließend gibt die php Seite dann das Ergebnis zurück.

    Das alles hat aber weniger mit C++ zu tun, sondern erstmal mit php und mySql. Wenn das steht, ist es egal ob der http Request aus einem in C++ geschriebenen Clienten kommt, ob via curl direkt aus der Kommandozeile, oder über einen beliebigen Client der http post requests schicken kann. (Ich habe dafür z.B. ein VS Code Plugin).

    Edit: Du kannst natürlich auch einen C++ Webserver schreiben, der auf der anderen Seite deine Anfragen entgegennimmt und der dann mit der Datenbank kommuniziert. Aber, dass macht es natürlich nicht einfacher.



  • @Schlangenmensch Ja da gebe ich dir Recht. HTTP ist nicht wirklich meine Stärke. Ich weiß wie man diese ohne Probleme in PHP Manipuliert oder für sich so nutzt, das es richtig gute Vorteile bringt. aber im allgemeinen fehlt mir das erweiterte Verständnis. Ich finde aber auch keine Wirklichen guten Bücher darüber oder Tutorials die, Zeigen wie man das ganze verstehen muss.

    Das Problem ist auch nicht das Verständnis, eher die Übersicht und die Anwendungsmöglichkeit die so eine lib bietet.
    Woher soll man denn wissen, wie ich so eine Lib anwenden kann.

    Bevor ich wieder nach Goldenen Karnischen suche, ist das die richtige Doku:
    https://curl.se/docs/manual.html

    Unter den Abschnitt HTTP und dann unter POST (HTTP) sollte doch genau das sein, was ich brauche oder?
    Ich frage deshalb, weil es unter C++ sehr oft vorkommt, das Funktionen so benannt sind, wo man denken könnte, das man weiß wofür diese Funktion steht, aber wenn man dann nachliest, genau das Gegenteil der fall wahr.



  • @Lucius Das ist die Doku zu dem curl commandline tool. Du suchst die Doku zu libcurl: https://curl.se/libcurl/c/

    Vielleicht hilft dir auch das weiter: https://everything.curl.dev/libcurl-http

    @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Ich frage deshalb, weil es unter C++ sehr oft vorkommt, das Funktionen so benannt sind, wo man denken könnte, das man weiß wofür diese Funktion steht, aber wenn man dann nachliest, genau das Gegenteil der fall wahr.

    Das wäre mir so noch nicht untergekommen. Aber Dokus können, insbesondere für Anfänger, schwer zu lesen sein.

    Wenn ich mit C++ die Auswahl hätte, würde ich mal hier: http://www.curlpp.org/ gucken, auf den ersten Blick finde ich den C++ Wrapper schöner, als das C-Interface.


  • Mod

    Du bist wahrscheinlich der erste, der bei den Namen der C++-Funktionen intuitiv zu verstehen meint, was sie machen .partial_sort_copy, ist doch klar! Andererseits bist du auch der wohl erste, der meint, C++ wäre schlecht dokumentiert. Mach bloß niemals eine andere Sprache, wenn dir die zahlreichen und vollumfänglichen C++-Referenzen nicht reichen…

    Zurück zum Thema: Ich habe den Eindruck, dass hier mächtig aneinander vorbei geredet wird, möglicherweise wegen mangelndem Begriffsverständnis. Was hast du denn und wo genau hast du Schwierigkeiten?

    • Hättest du einen Server, bei dem man so etwas wie dein_server/irgendwas anfordern könnte, und dann einen Text deiner Wahl, z.B. 123 zurück bekommt?
      • Diesen Server kannst du beispielsweise in deinem Browser, oder mit Curl auf der Kommandozeile ansprechen, und bekommst dann auch tatsächlich 123 angezeigt?
      • Könntest du statt 123 auch das Ergebnis einer Datenbankabfrage zurück geben? Falls Nein, warum nicht? Falls ja, funktioniert das auch im Browser oder mit Curl?
      • Könntest du auch weitere Parameter des GET-Requests verarbeiten bei solchen Anfragen? Falls Nein, warum nicht? Falls ja, funktioniert das auch im Browser oder mit Curl?
      • Könntest du statt GET-Requests auch POST-Requests verarbeiten? Falls Nein, warum nicht? Falls ja, funktioniert das auch mit Curl? (Im Browser geht POST etwas schwieriger, daher frage ich nicht)
    • Hast du Clientcode, der einen GET-Request an eine Adresse deiner Wahl schicken kann?
      • Dieser Client kann erfolgreich http://www.example.com abrufen und du bekommst dann auch den Quelltext eben jener Seite?
      • Dieser Client kann erfolgreich https://www.example.com (also verschlüsselt) abrufen und du bekommst dann auch den (entschlüsselten) Quelltext eben jener Seite? Falls Nein, warum nicht?
      • Hindert dich irgendetwas, diesen Client gegen deinen Server Abfragen machen zu lassen?
      • Fehlt dir etwas anderes, z.B. POST Requests? Wenn ja, was und warum?


  • Es ist vollbracht 😀 Ich habe es vollbracht, eine anfrage über Curl an einer php datei zu machen, die mir dann die Rückmeldung gibt, ob ein String übergeben wurden. Jetzt stellt sich die Frage, wie ich mehrere Strings abfragen und diese statt statisch eher in einer Variable legen kann?

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=MeinString");
    

    string variable= "MeinString";
    string variable2= "MeinString2";

    Also mein MeinString soll über "name=$variable AND $variable2" übergeben werden.

    Das $ soll nur die Variable kennzeichnen, hat natürlich nichts mit C++ zu tun.

    @SeppJ Da hast du mich aber missverstanden. Ich habe nicht gemeint, das C++ Schlecht Dokumentiert ist, sondern eher Mager. Aber eigentlich war dies eher auf die einzelnen Libs bezogen.



  • Bei CURLOPT_POSTFIELDS musst du Daten im Format application/x-www-form-urlencoded reinschreiben. Also im Format param1=value1&param2=value2&param3=value3. Parameternamen und Werte müssen dabei URL-encoded werden, also mit den lustigen %20 für Leerzeichen etc. URL-encoden kannst du z.B. mit curl_easy_escape. Oder du schreibst es dir selbst, ist nicht so schwer.

    Oder kurz gesagt: so wie auch der "query" Teil einer URL aufgebaut ist, bloss ohne ? am Anfang.

    Wenn du so Binärdaten übertragen willst, empfielt es sich diese Base64 oder hex zu kodieren. Das musst du auf der Empfängerseite dann manuell rückgängig machen - PHP weiss ja nicht dass der String der da kommt Base64/hex-kodiert ist. Wobei bei Base64 zu beachten ist dass der Output Zeichen enthalten kann die URL-encoded werden müssen. Also erst Base64-encoden und den Output davon dann nochmal URL-encoden. Bei hex ist das nicht nötig.



  • @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Bevor ich wieder nach Goldenen Karnischen suche, ist das die richtige Doku:
    https://curl.se/docs/manual.html

    Fast. Die Doku für lib curl findest du hier: https://curl.se/libcurl/ bzw. https://curl.se/libcurl/c/



  • @Lucius Nochwas: ich kann dir nur raten dein Englisch zu verbessern. Wie du selbst schon festgestellt hast, findet man kaum deutsche Doku und auch ansonsten nur wenig wirklich gute Infos. Wäre mMn. auch verschwendete Zeit sowas zu produzieren. Also Doku in zig verschiedene Sprachen zu übersetzen. Und Englisch ist sowieso praktisch wenn man es gut kann, ist ja quasi fast das ganze Internet in Englisch.

    Persönlich hab' ich erst gut Englisch gelernt als ich angefangen habe Filme/Serien auf Englisch zu schauen - und dann etwas später Bücher (belletristik) auf Englisch zu lesen. Und Doku auf Englisch lesen hilft natürlich auch - je mehr du das machst, desto leichter fällt es. Am Anfang muss man noch öfter mal Wörter nachschlagen, aber das wird schnell besser.



  • @hustbaer Da gebe ich dir recht, mein Englisch kann wirklich besser werden. Werde ich zu Herzen nehmen, da mich das selbst stört.

    Wenn ich dich richtig verstanden habe, müsste das dann so aussehen:

    char* encoded = curl_easy_escape(curl, "name=test", 0);;
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, encoded);
    

    Oder habe ich dich missverstanden? Also das mit der Variable 1 und 2 habe ich nicht wirklich verstanden.

    Das CURLOPT_POSTFIELDS wollte ich eigentlich in mehreren eingaben unterteilen, so das dies aus einer Variable statt statisch mit name=blabla steht.

    Da ich ja wesentlich mehr als nur ein String bei der PHP anfragen müsste, muss ich die CURLOPT_POSTFIELDS einer Variable versehen, damit diese auch wachsen kann. In den Dokus habe ich dies bezüglich nichts gefunden. Base64 ist auf meiner Liste 😀

    Ist das Normal, das ich in Wireshark keinerlei Bewegung unter http feststelle?



  • Ich frage nochmal: Warum machst du dir das leben so schwer und verwendest curl direkt (oder boost oder irgendeine andere relativ low level library?)

    Nutze https://github.com/libcpr/cpr oder irgendeine andere besser abstrahierte Library.

    Evtl. solltest du dir sogar überlegen erstmal gar keinen Client zu schreiben. Schreib doch erstmal deinen Server und teste ihnen mit einem HTTP Tool deiner Wahl (z.B. https://www.advancedrestclient.com/, https://www.postman.com/).



  • @Leon0402 Ne keine Sorge, ich habe die LibCpr auf der Liste. Danke für die Links: Postman kenne ich schon, aber das Advanced rest client kannte ich noch nicht. Gibt es ein Unterschied oder machen beide das gleiche ? Advanced REST Client ist ja OpenSource, Postman kostet ab bestimmten Konditionen.



  • @Lucius Es sollte auf deiner Liste ganz oben stehen. Zumindest weit vor Curl. Um genau zu sein sollte curl gar nicht erst auf der Liste stehen. Offensichtlich sieht deine Liste aber nicht so aus, denn du hast ja oben Beispiele mit Curl und Boost gezeigt, die geschrieben wurden.

    Ich verstehe ja deine Motivation dahinter von wegen, erstmal alles "richtig" lernen. Wer das noch nie gedacht hat, werfe den ersten Stein 🙂 Aber du erweckst den Eindruck als hättest du von HTTP und co wenig Ahnung hast. Das führt dann eher dazu, dass du Try & error mäßig dich da durchprobierst und die Hälfte wahrscheinlich von Stack Overflow zusammenkopierst. Das hat drei Dinge zur Folge:

    1. Du hast viel länger gebraucht, um dein Ziel zu erreichen
    2. Deine Lösung ist komplexer und mit Sicherheit auch nicht optimal (gibt ja viel mehr was man falsch machen kann, insbesondere wenn man keine Ahnung davon hat)
    3. Du hat es mit Sicherheit nicht "richtig" gelernt, sondern aller höchstens falsch 😉

    Darüber hinaus ist auch die Frage, was überhaupt "richtig" heißt. Möglichst viel von Hand und Low Level machen ist nicht, was die meisten als richtig betiteln würden. Man sollte sich in erster Linie das Leben nicht zu schwer machen. Mit ner höheren Programmiersprache mit C++ und ner Library für HTTP hast du immer noch genug neues zu lernen. Möglicherweise, gegebenfalls, unter Umständen macht es dann nochmal Sinn irgendwann das ganze sich etwas low level anzugucken. Z.B. auch bisschen Assembler zu können schadet nicht. Man kommt aber auch ganz gut durch, wenn man es nicht kann 😃 Das kommt dann immer etwas drauf an, was man konkret macht.

    Dasselbe gilt auch für Qt etc. ... klar kannst du auch alles mit OpenGL selber machen oder so. Sinnvoll ist das aber i.d.R. nicht. QT ist auch herausfordernd genug, aber es macht das Leben eben doch ein bisschen leichter. Lehne gerne QT ab, weil es etwas zu groß ist (und wirklich nen ganzes Framework ist) oder weil du die Lizenz komisch findest (du kannst es kommerziell aber nutzen) oder weil du einfach das Unternehmen nicht mag. Aber lehne es bitte nicht ab, weil du denkst, du würdest besser lernen (und schneller schon mal gar nicht), wenn du direkt mit Low Level Kram beginnst 😃
    Es gibt auch zahlreiche Alternativen zu QT.

    Zu deiner Frage mit Postman. Kein Plan. Kann glaube ich schon deutlich mehr, mir hat der Advanced Rest Client meistens gereicht. Ist jetzt aber auch nicht so als würde ich da tagtäglich 8h mit arbeiten.



  • @Leon0402 Ich unterteile eben das ganze mal:

    Du hast recht: LibCpr sollte oben auf meine Liste stehen, aber was ich überhaupt nicht verstehe ist warum? Was macht es besser als die Usability?
    Natürlich kann ich mir einiges damit erleichtern, mir geht es aber auch darum die anderen Libs kennenzulernen, für ein Anfänger in Sachen C++ ist es sehr schwer, sich auf andere dinge einzulassen, wenn man die dinge die man benutzt oder eher benutzen will, überhaupt noch nicht versteht.

    Der HTTP Header ist für mich kein Geheimnis sondern eher nur ein Rätzel, ein Beispiel:
    Im Boost.Asio hatte ich durch die anderen zusätzlich festgestellt, das bei einer Domain die SSL besitzt, die Request anfrage nicht auf port 80 Funktion, sondern ich diese über SSL ansteuern muss. Wie genau weiß ich noch nicht. Jetzt ist es aber so, wenn man im Header also unter HOST: eine andere Domain wie: stackoverflow.com als die eigene, die man eintragen hat, ausführt, mir dann ohne weiteres meine html Datei über denselben weg, trotz fehlender SSL Verbindung mit dem 200 OK ausgelesen bekomme, wie kann das sein? 🤓

    std::stringstream getRequest;
    		getRequest << "GET / HTTP/1.1\r\n";
    		getRequest << "Host: stackoverflow.com\r\n";
    		getRequest << "Connection: keep-alive\r\n";
    		getRequest << "User-Agent: C/1.0";
    		getRequest << "Content-Type: application/x-www-form-urlencoded\r\n";
    		getRequest << "Accept: */*\r\n";
    		getRequest << "Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
    		getRequest << "\r\n";
    
    boost::asio::ip::tcp::resolver::query query("domain.de", "80");
    resolver.async_resolve(query, resolveHandler);
    
    ioservice.run();```cpp
    

    Eigentlich sollte genau dieselbe Meldung mit 301: Moved Permanently kommen, das aber passiert nicht.
    Sollte dies eine Sicherheitslücke sein, dann fragt sich: Kommt diese aus Boost, oder vom HTTP Header selbst?

    QT ist für mich kein Schlechtes Framework, sondern eher die Lizenz Vereinbarung dahinter. Auch wenn man kommerziell diese verwenden darf, besagt die Lizenz: Das man bei einer Änderung der Lizenz das recht hat, im Nachhinein, dies und jenes zu verbieten, obwohl ich die Version von QT schon lange verwende. Ich würde ja verstehen, wenn man die neuen Versionen unter der neuen Lizenz verankert, aber doch nicht die, die ich schon verwende.

    wxWidgets ist meiner Meinung nach viel besser, nicht aus der Sicht der Usability, allerdings erwarten mich da keine Bösen Überraschungen. Ich habe bereits mir QT angesehen und eigentlich ist das schon eine Geile Sache, aber die Lizenz ist eine reine Zumutung. Natürlich muss das jeder einzelne für sich entscheiden, ob er solch einer Lizenz zustimmt. Und mit Mögen hat das weniger zu tun.

    Aber heute laufend des Tages, werde ich mir das Cpr ansehen. Obwohl das eher danach aussieht, das man APIs ansteuern kann, muss ich erstmal herausfinden, wie man das im Bereich Request zur einer PHP verwendet. Ich lerne eher aus Beispielen, ich habe So viele Bücher zuhause, die mir zwar die Details erklären und das ist toll, aber es bringt nichts, wenn ich nicht weiß, wie ich diese in der Praxis anwende 😄



  • @Leon0402 boost::asio::ip::tcp ist auch kein library für das HTTP Protokoll!
    Es implementiert nur das TCP Protokoll.

    Nochmal meine Frage wieso willst du hier umbedingt C++ verwenden und nicht C# was du anscheinend schon kennst.

    Du hast aktuell das Problem, dass du dich in C++ und das HTTP Protokoll einarbeiten musst, weil du von beidem bisher null Ahnung hast



  • @firefly In C# stört es mich sehr, das man die exe ohne weiteres Dekompilieren kann. Mir ist bekannt, das es mittel und wege in c++ gibt, auch diese auszulesen. Mir geht es aber darum, das C# durch die ganzen Frameworks, ständig aktualisiert werden. Dummerweise wurde das Dot Net Core mit dem heutigen .Net 6 und schon draußen das .Net 7 zusammen gelegt. Eigentlich keine Schlechte Idee, allerdings irgendwie doch. Wie wir MS kennen, verschlimmbessern die ständig irgendwelche dinge.

    Auch wenn ich mein Programm Dumm Programmiere, das dieses nichts beinhaltet, stört es mich sehr, das ich Offen wie eine Hose bin. in C++ ist der Weg ein ganz anderer. Meine Source verschleiern muss ich in C++ nicht. Klar muss ich dafür andere dinge tun, aber es ist ein anderes Gefühl.

    Ich fühle mich nicht wirklich wohl dabei noch C# zu nehmen. Ich komme von C#, allerdings bin ich eher PHPler und ja Http Header und .Co waren noch nie wirklich Thema bei mir, aber dennoch bin ich darin Stärker als in C#. C# war nur die Wahl wegen der WPF. Ansonsten finde ich die ständigen .Net Updates nervig. Ich will auch nicht sagen das C# eine Schlechte Sprache ist, ganz im gegenteil, aber Was mich auch an das CLI von MS stört, ist die Tatsache, das es Frameworks wie das Entity Framework gibt, eigentlich total genial ist, aber durch die Gegebenheit, das auch dieses Framework Zugang zur MySQL etc. braucht, nicht so ohne weiteres verwendet werden kann.

    Ablegen im Code geht also auch nicht. Ich müsste mich wieder aktiv in C# einlesen, welche dinge neu sind und wie ich diese am besten anwende, da kann ich direkt eine neue Sinnvolle Sprache lernen, die mir einiges mehr bietet. Komfort ist mir nicht wirklich wichtig. Klar wäre es schön, sowas wie WPF zuhaben, aber der Preis ist mir einfach zu Hoch. Das Intervall der Updates eines Frameworks ist mir auch einfach zu kurz.



  • Was willst du den "verschleiern", was man oft nicht rein durch die Verwendung des Clients herausfinden kann?
    Denn das DB PW kann es ja nicht mehr sein,denn das liegt in der konfiguration des Webservers mit dem der Client via HTTP requests kommuniziert



  • @firefly Naja über das Entity Framework kannst du dich mit dem MySQL Server von deiner Geschriebenen Anwendung aus verbinden. Der Nachteil ist, das du trotzdem die Zugangsdaten dafür ablegen muss. Im Programm Hardcoden ist natürlich keine Option. Und verschleiern möchte ich mein Source-Code. Ich habe zwar ein Obfuscator, der das kann, allerdings nur für .Net Framework 4.8 wie gesagt, die kurzen Update Intervalle Einens Frameworks ist viel zu Kurz, klar braucht man nicht immer das neuste, aber Aktuell halten muss ich trotzdem irgendwann mal.



  • Ich verstehe jetzt echt nicht was das Problem ist. Lerne C++, lerne wie HTTP-requests auszusehen haben. Stell einen Server hin, lass einen Webserver drauf laufen der PHP ausführen kann. Schreib Deine Middleware in PHP und alles ist gut!?



  • @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Naja über das Entity Framework kannst du dich mit dem MySQL Server von deiner Geschriebenen Anwendung aus verbinden. Der Nachteil ist, das du trotzdem die Zugangsdaten dafür ablegen muss. Im Programm Hardcoden ist natürlich keine Option.

    Öhm Wieso muss man das tun? Nur weil das Framework so was anbietet, ist es noch lange kein muss. Und das als Begründung wieso C# überhaupt nicht in Frage kommt ergibt für mich keinen sinn.
    Die restlichen Gründe schon, aber das hier nicht.

    Du kannst In C# genau das selbe tun was du jetzt mit C++ vorhast.
    Einen Client schreiben, welcher via HTTP Requests mit einem WebServer spricht um daten abzufragen/zu ändern. Egal ob die Daten dann auf Serverseite in einer DB oder sonst wie abgelegt sind.
    Mit C# ist es sogar zum teil einfacher weil die entsprechenden Klassen Bestandteil des .Net Framework sind (Stichpunkt HttpClient).

    @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    die kurzen Update Intervalle Einens Frameworks ist viel zu Kurz, klar braucht man nicht immer das neuste, aber Aktuell halten muss ich trotzdem irgendwann mal.

    Das gleiche Problem hast du auch mit C++. Und zwar musst du die verwendete Third-Party library, welche du für HTTP Requests nutzt, auch regelmäßig aktuell halten.

    Ich habe irgendwie das Gefühl du vermischst hier mehrere Themen/Punkte:

    1. Welche Sprache wird für die Erstellung des Clients benutzt
    2. Daten sollen in einer DB abgelegt werden und wie greift der Client darauf zu
    3. Zugangsdaten für die DB sollen geschützt werden.

    Aufgrund deiner Aussagen scheinst du die Punkte 1 und 2 zu vermischen wenn es um das .Net Framework bzw. C# geht.
    Nur weil es für das .Net Framework das Entity Framework gibt, welche auch direkt mit einer DB kommunizieren kann, heißt das nicht, dass man das generell so machen muss.
    Falls das Entity Framework das nur so kann, dann ist diese Framework dann schlicht die falsche Wahl um damit den Client zu entwickeln.

    Ansonsten kann ich mich nur anschließen was Swordfish gesagt hat.



  • @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Wenn ich dich richtig verstanden habe, müsste das dann so aussehen:

    char* encoded = curl_easy_escape(curl, "name=test", 0);;
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, encoded);
    

    Oder habe ich dich missverstanden?

    Du hast mich misverstanden 🙂
    So wie du das schreibst, wir der String "name=test" als ganzes URL-encoded. Das ist aber nicht Sinn der Sache. Das = Zeichen soll ja nicht encoded werden. Das ist ja das Trennzeichen zwischen dem Parameter-Namen und dem Wert.

    Also das mit der Variable 1 und 2 habe ich nicht wirklich verstanden.

    Das CURLOPT_POSTFIELDS wollte ich eigentlich in mehreren eingaben unterteilen, so das dies aus einer Variable statt statisch mit name=blabla steht.

    Da ich ja wesentlich mehr als nur ein String bei der PHP anfragen müsste, muss ich die CURLOPT_POSTFIELDS einer Variable versehen, damit diese auch wachsen kann. In den Dokus habe ich dies bezüglich nichts gefunden.

    Ich denke ein kleines Code-Beispiel ist einfacher als wenn ich versuche es mit Worten zu erklären...

    #include <string>
    #include <string_view>
    #include <memory>
    #include <iostream>
    
    #include <string.h>
    #include <limits.h>
    
    #include <curl/curl.h>
    
    struct FreeDeleter {
        void operator()(void* p) {
            free(p);
        }
    };
    
    template <class T>
    using UniqueFreePtr = std::unique_ptr<T, FreeDeleter>;
    
    // ACHTUNG: `name` darf keine Zeichen enthalten die URL-encoded werden müssten!
    void appendPostFieldParamAndValue(std::string& inout_postFields, CURL* easy, std::string_view name, std::string_view value) {
        if (value.size() > INT_MAX)
            throw std::runtime_error("meh");
        UniqueFreePtr<char> encodedValue{curl_easy_escape(easy, value.data(), static_cast<int>(value.size()))};
        if (!encodedValue)
            throw std::runtime_error("meh2");
    
        if (!inout_postFields.empty())
            inout_postFields.push_back('&');
    
        inout_postFields.append(name);
        inout_postFields.push_back('=');
        inout_postFields.append(encodedValue.get());
    }
    
    int main() {
        try
        {
            CURL* curl = curl_easy_init();
            if (!curl) {
                throw std::runtime_error("meh3)");
            }
    
            // Die Parameter die wir schicken wollen:
            std::string name = "Bob der Baumeister";
            std::string kundenNr = "123";
            std::string nochwas = "a, b, c";
    
            // Post-fields string aus den einzelnen Parametern bauen...
            std::string postFields;
            appendPostFieldParamAndValue(postFields, curl, "name", name);
            appendPostFieldParamAndValue(postFields, curl, "kundenNr", kundenNr);
            appendPostFieldParamAndValue(postFields, curl, "nochwas", nochwas);
    
            std::cout << "POST fields: " << postFields << "\n";
    
            curl_easy_cleanup(curl);
        }
        catch (std::exception const& e) {
            std::cout << std::endl << "Fehler: " << e.what() << std::endl;
            return 1;
        }
    }
    

    Ist das Normal, das ich in Wireshark keinerlei Bewegung unter http feststelle?

    Wenn du über HTTPS kommunizierst, dann ja.


Anmelden zum Antworten