C/C++ HTTP POST с использованием WinINet/WinHttp ⇐ C++
-
Гость
C/C++ HTTP POST с использованием WinINet/WinHttp
Я пытаюсь отправить HTTP-запрос на публикацию по URL-адресу (например, http://example.com/info.php) с некоторыми пользовательскими переменными POST и вернуть то, что возвращает сайт.
Я несколько раз пытался создать правильную функцию, но каждый раз это приводило к ошибке, то же самое происходило и с кодом, найденным в Интернете: либо он не работал, либо неправильно возвращал ответ сайта, либо не отправлял данные сообщения запроса.
Есть ли у кого-нибудь работающая функция для этого, использующая WinHttp/WinINet?
Можете ли вы подробно объяснить, как это работает?
Мой код:
char* send_post_request(const char* url, const char* action) { HINTERNET hInternet = InternetOpenA("Mozilla/5.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); если (hInternet == NULL) { вернуть НУЛЬ; } ХИНТЕРНЕТ hRequest = HttpOpenRequestA( hInternet, "POST", URL, NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); если (hRequest == NULL) { InternetCloseHandle(hInternet); вернуть НУЛЬ; } HttpAddRequestHeadersA(hRequest, «Тип контента: application/x-www-form-urlencoded», -1, HTTP_ADDREQ_FLAG_ADD); HttpAddRequestHeadersA(hRequest, string("Content-Length: %d" + strlen(action)).c_str(), -1, HTTP_ADDREQ_FLAG_ADD); BOOL успех = HttpSendRequestA (hRequest, NULL, 0, NULL, 0); если (!успех) { InternetCloseHandle(hRequest); InternetCloseHandle(hInternet); вернуть НУЛЬ; } DWORD байт_получено; символьный ответ[1024]; успех = InternetReadFile (hRequest, ответ, sizeof (ответ), &bytes_received); если (!успех) { InternetCloseHandle(hRequest); InternetCloseHandle(hInternet); вернуть НУЛЬ; } InternetCloseHandle(hRequest); InternetCloseHandle(hInternet); обратный ответ; }```
Я пытаюсь отправить HTTP-запрос на публикацию по URL-адресу (например, http://example.com/info.php) с некоторыми пользовательскими переменными POST и вернуть то, что возвращает сайт.
Я несколько раз пытался создать правильную функцию, но каждый раз это приводило к ошибке, то же самое происходило и с кодом, найденным в Интернете: либо он не работал, либо неправильно возвращал ответ сайта, либо не отправлял данные сообщения запроса.
Есть ли у кого-нибудь работающая функция для этого, использующая WinHttp/WinINet?
Можете ли вы подробно объяснить, как это работает?
Мой код:
char* send_post_request(const char* url, const char* action) { HINTERNET hInternet = InternetOpenA("Mozilla/5.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); если (hInternet == NULL) { вернуть НУЛЬ; } ХИНТЕРНЕТ hRequest = HttpOpenRequestA( hInternet, "POST", URL, NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); если (hRequest == NULL) { InternetCloseHandle(hInternet); вернуть НУЛЬ; } HttpAddRequestHeadersA(hRequest, «Тип контента: application/x-www-form-urlencoded», -1, HTTP_ADDREQ_FLAG_ADD); HttpAddRequestHeadersA(hRequest, string("Content-Length: %d" + strlen(action)).c_str(), -1, HTTP_ADDREQ_FLAG_ADD); BOOL успех = HttpSendRequestA (hRequest, NULL, 0, NULL, 0); если (!успех) { InternetCloseHandle(hRequest); InternetCloseHandle(hInternet); вернуть НУЛЬ; } DWORD байт_получено; символьный ответ[1024]; успех = InternetReadFile (hRequest, ответ, sizeof (ответ), &bytes_received); если (!успех) { InternetCloseHandle(hRequest); InternetCloseHandle(hInternet); вернуть НУЛЬ; } InternetCloseHandle(hRequest); InternetCloseHandle(hInternet); обратный ответ; }```
Мобильная версия