WinInet HTTP POST
-
Hi, folgende Funktion versuche ich gerade zum Laufen zu bringen.
#include <iostream> #include <shlwapi.h> #include <wininet.h> #include <tchar.h> using namespace std; #pragma comment (lib, "shlwapi.lib") #pragma comment (lib, "WinInet.lib") BOOL SendPOSTRequest (wchar_t* url, wchar_t* params, wchar_t* response, DWORD* dwState); int main () { DWORD state; wchar_t response [20000]; SendPOSTRequest (L"http://google.de", L"", response, &state); wcout<<response; return 0; } BOOL SendPOSTRequest (wchar_t* url, wchar_t* params, wchar_t* response, DWORD* dwState) { wchar_t server [INTERNET_MAX_URL_LENGTH] = L""; DWORD length = INTERNET_MAX_URL_LENGTH; if (S_OK != UrlGetPart (url, server , &length, URL_PART_HOSTNAME, 0)) return FALSE; wchar_t hdrs[] = L"Content-Type: application/x-www-form-urlencoded"; wchar_t accept[] = L"*/*"; wchar_t buf [1024] = L""; DWORD dwBytesRead = 0; HINTERNET hSession = InternetOpen (L"Firefox", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); HINTERNET hConnect = InternetConnect (hSession, server, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1); HINTERNET hRequest = HttpOpenRequest (hConnect, L"POST", url, NULL, NULL, NULL, 0, 1); HttpSendRequest (hRequest, hdrs, wcslen(hdrs), params, wcslen(params)); HttpQueryInfo (hRequest, HTTP_QUERY_USER_AGENT, &dwState, NULL, NULL); while (InternetReadFile (hRequest, buf, 1024, &dwBytesRead) && dwBytesRead) { wcscat (response, buf); } return TRUE; }Response ist einfach leer und in dwstate stehen auch nur komische Werte. Jemand eine Idee?
-
Ja. Rückgabewerte überprüfen. GetLastError benutzen.
-
Okay!
HttpQueryInfo(hRequest, HTTP_QUERY_USER_AGENT, &dwState, NULL, NULL);
Hier gibts Error Code 87:ERROR_INVALID_PARAMETER
87
The parameter is incorrect.Hier Error Code 122: hRequest = HttpOpenRequest(hConnect, L"POST", url, NULL, NULL, NULL, 0, 1);
ERROR_INSUFFICIENT_BUFFER
122
The data area passed to a system call is too small.Nichtsdestotrotz denke ich es gibt noch weitere Fehler. Bei HttpOpenRequest war ich mir zum Beispiel mit dem dritten Parameter nicht sicher. Und auch bei einigen andere Parametern war ich ratlos.
-
So ich habe jetzt soweit alles gefixt, aber HttpOpenRequest gibt immer noch Error 122. Ich bin ratlos...
#include <iostream> #include <shlwapi.h> #include <wininet.h> #include <string> using namespace std; #pragma comment (lib, "shlwapi.lib") #pragma comment (lib, "WinInet.lib") BOOL SendPOSTRequest (wchar_t* url, wchar_t* params, wchar_t* response, DWORD* dwState); BOOL getQuery (wchar_t* url, wstring & query, wchar_t* server); int main () { DWORD state; string resp (""); wchar_t response[] = L""; SendPOSTRequest (L"http://google.de", L"", response, &state); cout <<state<<endl; wcout<<response<<endl; return 0; } BOOL SendPOSTRequest (wchar_t* url, wchar_t* params, wchar_t* response, DWORD* dwState) { wchar_t server [INTERNET_MAX_URL_LENGTH]; wstring qry (L""); getQuery (url, qry, server); const wchar_t hdrs[] = L"Content-Type: application/x-www-form-urlencoded"; DWORD code = sizeof (DWORD), dwBytesRead = sizeof (DWORD), dwBytesWritten = sizeof (code), length = INTERNET_MAX_URL_LENGTH; HINTERNET hRequest, hSession, hConnect; hSession = InternetOpen(L"Firefox", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (hSession != NULL) { hConnect = InternetConnect(hSession, server, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); if (hConnect != NULL) { hRequest = HttpOpenRequest(hConnect, L"POST", qry.c_str(), L"", NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); if (hRequest != NULL) { HttpSendRequest(hRequest, hdrs, wcslen(hdrs), (void*)params, wcslen(params)); HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &code, &dwBytesWritten, NULL); wchar_t *buf = new wchar_t [1024]; while (InternetReadFile (hRequest, buf, sizeof (buf), &dwBytesRead) && dwBytesRead) { wcscat (response, buf); } delete buf; } } } return TRUE; } BOOL getQuery (wchar_t* url, wstring & query, wchar_t* server) { wchar_t buf[MAX_PATH] = L""; DWORD dwLen = MAX_PATH; if(S_OK != UrlGetPart(url, server, &dwLen, URL_PART_HOSTNAME, 0)) { return FALSE; } wstring host(server); query = url; query.erase(0, query.find(host) + host.length()); return TRUE; }
-
Für response hast du keinen speicher reserviert. das sizeof(buf) in InternetReadFile gibt die größe des pointers zurück, nicht die des buffers also 4. das wcscat wird auch ned funzen. etc etc. wieso benutzt du diese dämlichen wchar_t typen?
-
Weil char* und string nunmal nicht Unicode sind...
Und das erklärt auch nicht den 122 Error bei HttpOpenRequest.
-
Komisch ich dachte immer hier wären n paar Leute die echt was könnten. Aber immer wenn ich Fragen stelle gibts sogut wie keine Hilfe... Danke für nichts, wie immer, ihr supertollen Mitglieder des C/C++ Forums (gibt echt bessere)...
-
ich hab dir mehr als genug hilfe gegeben. dir fehlen einfach die elementaren grundlagen.
-
Jop, so super Hilfen wie "etc etc". Aber die eigentliche Frage nicht beantworten. N1, mein Freund!

-
deine provokante art hat mir die lust am helfen genommen
-
Und Deine generelle Arschlochhaltung geht mir auf die Testikel.
