c++ 开发一个简单的winhttp请求发送和接收的应用程序dome
以下是一个使用WinHTTP发送和接收HTTP请求的简单C++代码示例:
#include <windows.h>
#include <winhttp.h>
#include <iostream>
#include <string>
#pragma comment(lib, "winhttp.lib")
using namespace std;
int main()
{
// 创建一个WinHTTP会话句柄
HINTERNET hSession = WinHttpOpen(L"MyApp", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
if (!hSession)
{
cout << "Failed to create WinHTTP session: " << GetLastError() << endl;
return 1;
}
// 创建一个WinHTTP连接句柄
HINTERNET hConnect = WinHttpConnect(hSession, L"www.example.com", INTERNET_DEFAULT_HTTP_PORT, 0);
if (!hConnect)
{
cout << "Failed to create WinHTTP connection: " << GetLastError() << endl;
WinHttpCloseHandle(hSession);
return 1;
}
// 创建一个WinHTTP请求句柄
HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/index.html", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
if (!hRequest)
{
cout << "Failed to create WinHTTP request: " << GetLastError() << endl;
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
// 发送WinHTTP请求
if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))
{
cout << "Failed to send WinHTTP request: " << GetLastError() << endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
// 接收WinHTTP响应
if (!WinHttpReceiveResponse(hRequest, NULL))
{
cout << "Failed to receive WinHTTP response: " << GetLastError() << endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
// 获取WinHTTP响应状态码
DWORD dwStatusCode = 0;
DWORD dwSize = sizeof(dwStatusCode);
WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwSize, NULL);
// 获取WinHTTP响应头信息
wstring strHeaders;
dwSize = 0;
WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX);
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
wchar_t* pBuffer = new wchar_t[dwSize / sizeof(wchar_t)];
if (WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, pBuffer, &dwSize, WINHTTP_NO_HEADER_INDEX))
{
strHeaders = pBuffer;
}
delete[] pBuffer;
}
// 获取WinHTTP响应内容
string strContent;
DWORD dwReadSize = 0;
do
{
char szBuffer[1024];
if (!WinHttpReadData(hRequest, szBuffer, sizeof(szBuffer), &dwReadSize))
{
cout << "Failed to read WinHTTP response data: " << GetLastError() << endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 1;
}
if (dwReadSize > 0)
{
strContent.append(szBuffer, dwReadSize);
}
} while (dwReadSize > 0);
// 输出WinHTTP响应结果
cout << "Status code: " << dwStatusCode << endl;
wcout << L"Headers: " << strHeaders << endl;
cout << "Content: " << strContent << endl;
// 关闭WinHTTP句柄
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 0;
}
该代码执行以下操作:
- 创建一个WinHTTP会话句柄。
- 创建一个WinHTTP连接句柄。
- 创建一个WinHTTP请求句柄。
- 发送一个HTTP GET请求。
- 接收HTTP响应并获取响应状态码、响应头信息和响应内容。
- 输出HTTP响应结果。
- 关闭WinHTTP句柄。
请注意,此示例仅适用于发送和接收HTTP请求。如果要使用HTTPS,请将WinHttpOpen函数的第二个参数设置为WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,并使用WinHttpSetOption函数设置WINHTTP_OPTION_SECURITY_FLAGS选项以启用SSL
原文地址: https://www.cveoy.top/t/topic/flLT 著作权归作者所有。请勿转载和采集!