写个WinHttp 访问https://www.amazon.com.au/ap/signin 并返回响应内容
时间: 2023-07-19 09:19:07 浏览: 216
WinHttp访问网页.rar
下面是使用 WinHttp 访问 https://www.amazon.com.au/ap/signin 并返回响应内容的示例代码:
```cpp
#include <windows.h>
#include <winhttp.h>
#include <iostream>
#include <string>
#pragma comment(lib, "winhttp.lib")
int main()
{
HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL;
// 初始化 WinHttp
hSession = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
if (!hSession)
{
std::cout << "Failed to open WinHttp session." << std::endl;
return 1;
}
// 建立连接
hConnect = WinHttpConnect(hSession, L"www.amazon.com.au", INTERNET_DEFAULT_HTTPS_PORT, 0);
if (!hConnect)
{
std::cout << "Failed to connect to server." << std::endl;
WinHttpCloseHandle(hSession);
return 1;
}
// 创建请求
hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/ap/signin", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
if (!hRequest)
{
std::cout << "Failed to create request." << std::endl;
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
// 发送请求
if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))
{
std::cout << "Failed to send request." << std::endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
// 等待响应
if (!WinHttpReceiveResponse(hRequest, NULL))
{
std::cout << "Failed to receive response." << std::endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
// 读取响应内容
std::string response;
DWORD dwSize = 0, dwDownloaded = 0;
LPSTR pszOutBuffer = NULL;
do
{
// 确定缓冲区大小
dwSize += 4096;
pszOutBuffer = (LPSTR)realloc(pszOutBuffer, dwSize);
if (!pszOutBuffer)
{
std::cout << "Out of memory." << std::endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
// 读取响应内容
ZeroMemory(pszOutBuffer + dwDownloaded, 4096);
if (!WinHttpReadData(hRequest, pszOutBuffer + dwDownloaded, 4096, &dwDownloaded))
{
std::cout << "Failed to read data." << std::endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
// 将读取到的内容添加到字符串中
response.append(pszOutBuffer + dwDownloaded, dwDownloaded);
} while (dwDownloaded > 0);
// 输出响应内容
std::cout << response << std::endl;
// 释放资源
free(pszOutBuffer);
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 0;
}
```
这段代码与前面的代码类似,不同之处在于它将响应内容保存到一个 std::string 类型的变量中,并在读取响应内容时将每次读取到的内容添加到字符串中。最后输出字符串即可。
阅读全文