Simpler POST per Wininet - verzweifle :)



  • Hi,

    versuche nun schon seit paar Tagen nen POST-request per WinInet hinzubekommen. Mein Code ist sehr simpel. Ich verstehe nicht, warum er keinen response bekommt. Mein buffer ist stets leer!!

    Kann mir evtl. jemand weiterhelfen?

    Vielen DANK !!!

    #include "stdafx.h"
    #include <wininet.h>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char buffer[8192];
    	DWORD dwRead = 0;
    
    	static LPCTSTR Url = "http://localhost";
    	static LPCTSTR Browser = "Firefox";
    	static LPCTSTR AcceptType = "*/*";
    	static LPCTSTR ContentType = "Content-Type: application/x-www-form-urlencoded";
    	static LPVOID Value = "post=test";
    
    	HINTERNET inet = InternetOpen(Browser, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    
    	HINTERNET url = InternetConnect(inet, Url, INTERNET_DEFAULT_HTTP_PORT, 0, 0, INTERNET_SERVICE_HTTP, 0, NULL);
    
    	HINTERNET request = HttpOpenRequest(url, "POST", "/index.php", NULL, HTTP_VERSION, &AcceptType, INTERNET_FLAG_KEEP_CONNECTION, NULL);
    
    	HttpSendRequest(request, ContentType, strlen(ContentType), "test=1", sizeof("test=1"));
    
    	InternetReadFile(request, &buffer, sizeof(buffer), &dwRead);
    	buffer[dwRead] = '\0';
    
    	InternetCloseHandle(request);
    	InternetCloseHandle(url);
    
    	cout << buffer << endl;
    
    	return 0;
    }
    


  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Schau doch mal mit einem Sniffer wie zB Wireshark(Filter auf Port 80 setzen) was überhaupt gesendet wird. Dann vergleiche das mit dem was ein Browser sendet.

    Andererseits hab ichs nach ner Weile aufgegeben mit Wininet und habe Sockets genommen da mir Wininet zuviel in meinen HTTP Headern und Cookies etc rumgeändert hat. Auch waren multipart POSTs zum Senden von Dateien nicht sinnvoll möglich.

    Alternativ kannst du dir auch die RFCs zum HTTP Protokoll durchlesen und es dann mit Sockets implementieren.



  • Anscheinend komm ich erst gar nicht mal zum senden. Ich bekommen beim HttpOpenRequest nen Error 122. Hab schon gegooglet, aber nichts gefunden.



  • Du übergibst 2 Dinge falsch an HttpOpenRequest. Lies in der MSDN die Doku zu der Funktion und check' deinen Code dagegen, dann findest du die bestimmt.
    Ich sage dir ganz bewusst nicht welche beiden Parameter falsch sind, schliesslich solltest du das machen BEVOR du hier postest 😉

    BTW: der Error Code 122 bedeutet auch was. Guck nach was. Wird dir in dem Fall vermutlich nicht viel bringen. Allerdings wenn du schon einen Error Code ermittelt hast könntest du netter Weise auch gleich posten was er bedeutet, damit die Leute von denen du Hilfe erwartest oder erhoffst nicht jeder für sich nachsehen müssen.



  • hustbaer schrieb:

    Du übergibst 2 Dinge falsch an HttpOpenRequest. Lies in der MSDN die Doku zu der Funktion und check' deinen Code dagegen, dann findest du die bestimmt.
    Ich sage dir ganz bewusst nicht welche beiden Parameter falsch sind, schliesslich solltest du das machen BEVOR du hier postest 😉

    BTW: der Error Code 122 bedeutet auch was. Guck nach was. Wird dir in dem Fall vermutlich nicht viel bringen. Allerdings wenn du schon einen Error Code ermittelt hast könntest du netter Weise auch gleich posten was er bedeutet, damit die Leute von denen du Hilfe erwartest oder erhoffst nicht jeder für sich nachsehen müssen.

    bla bla bla



  • Laut MSDN verweist 122 auf ERROR_INSUFFICIENT_BUFFER. Doch für die Initialisierung des Handlers übergebe ich doch nirgends einen Buffer. Wenn dann müsste es ja intern verwendet werden, worauf ich sicherlich keinen Einfluss habe.

    Selbst wenn ich die HTTP_VERSION auf "HTTP/1.1" stelle und den dwFlag auf INTERNET_FLAG_KEEP_CONNECTION stelle tut sich da nichts. Die restlichen Paramerter habe ich doch laut MSDN richtig angegeben.

    Geht es um null-terminating? Auch \0 bringt nichts.



  • Komm schon hustbaer, sag mir doch, was ich falsch gemacht habe. Evtl. liegt gar nicht daran, und ich hab den Error immernoch?



  • Halt die Fresse, haterskater! Geh heim wohnen, oder bohr dir ein Loch ins Knie oder sowas, ja?

    @OP:
    OMG.
    Doku Lesen ist anscheinend echt schwer 🙄

    Du übergibst HTTP_VERSION als Referrer (zählen! 4 != 5), und dein AcceptType ist kein nullterminiertes Array aus Zeigern auf nullterminierte Strings, sondern bloss ein Zeiger auf einen Zeiger auf einen nullterminierten String. Wichtiger Unterschied.

    //static LPCTSTR AcceptType = "*/*";
    LPCTSTR AcceptTypes[] = {"*/*", 0};
    
    //...
    
    HINTERNET request = HttpOpenRequest(url, "POST", "/index.php", HTTP_VERSION, NULL, AcceptTypes, INTERNET_FLAG_KEEP_CONNECTION, NULL);
    

    Laut MSDN verweist 122 auf ERROR_INSUFFICIENT_BUFFER. Doch für die Initialisierung des Handlers übergebe ich doch nirgends einen Buffer. Wenn dann müsste es ja intern verwendet werden, worauf ich sicherlich keinen Einfluss habe.

    Ich sagte ja, wird in dem Fall vermutlich nix bringen. Hab den Fehler ja selbst nacchgesehen bevor ich gepostet habe. Ich schätze die Funktion wird intern den "Accept-Type" Parameter kopieren wollen, und da du den nicht richtig terminiert hast... kann alles mögliche passieren. Könnte genauso gut in einer Access-Violation enden.


Anmelden zum Antworten