21xrx.com
2024-12-22 23:43:23 Sunday
登录
文章检索 我的文章 写文章
C++ Wininet 发送请求教程
2023-06-28 01:21:57 深夜i     --     --
C++ Wininet 发送请求 教程 网络编程

Wininet 是 Windows 系统中提供的网络编程库,它可以方便地处理 HTTP 请求,支持 GET、POST 等常见操作。本教程将介绍如何使用 C++ 和 Wininet 发送 HTTP 请求。

1. 创建会话和连接

使用 Wininet 第一步是创建会话和连接。使用 InternetOpen 函数可以创建一个会话,使用 InternetConnect 函数可以创建一个连接。代码如下:


HINTERNET hSession = InternetOpen("MyApp", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

HINTERNET hConnect = InternetConnect(hSession, "www.example.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);

其中:

- "MyApp" 是你的应用程序名称,可以随便取;

- "www.example.com" 是你要连接的主机名;

- INTERNET_DEFAULT_HTTP_PORT 是 HTTP 协议的默认端口号;

- INTERNET_SERVICE_HTTP 指定了连接的服务类型;

- 0 和 1 是一些附加选项,建议设为默认值。

2. 构造 HTTP 请求

接下来需要构造 HTTP 请求。以 GET 请求为例,构造方法如下:


HINTERNET hRequest = HttpOpenRequest(hConnect, "GET", "/", NULL, NULL, NULL, INTERNET_FLAG_RELOAD, 0);

其中:

- hConnect 是上一步创建的连接;

- "GET" 是 HTTP 方法;

- "/" 是请求的路径;

- NULL 表示请求头为空;

- NULL 表示请求头长度为 0;

- NULL 表示请求体为空;

- INTERNET_FLAG_RELOAD 是一些附加选项,建议设为默认值;

- 0 是一些附加选项,建议设为默认值。

如果是 POST 请求,则需要在 HttpOpenRequest 函数的第 4 个参数传入一个非空字符串,表示请求头中的 Content-Type 信息(例如 "application/x-www-form-urlencoded"),并在第 5 个参数传入请求体的指针和长度。

3. 发送 HTTP 请求

构造好 HTTP 请求之后,可以使用 HttpSendRequest 函数发送请求:


HttpSendRequest(hRequest, NULL, 0, NULL, 0);

其中:

- hRequest 是上一步创建的请求;

- NULL 表示请求头为空;

- 0 表示请求头长度为 0;

- NULL 表示请求体为空;

- 0 表示请求体长度为 0。

4. 接收响应

发送请求之后,需要接收响应。可以使用 HttpQueryInfo 函数获取响应头信息,使用 InternetReadFile 函数读取响应体信息。代码如下:


DWORD statusCode = 0;

DWORD statusCodeLength = sizeof(statusCode);

HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &statusCode, &statusCodeLength, NULL);

BYTE buffer[1024];

DWORD bytesRead = 0;

while (InternetReadFile(hRequest, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0)

  // 处理响应体数据

其中:

- statusCode 变量用于存储响应状态码;

- HTTP_QUERY_STATUS_CODE 表示查询状态码;

- HTTP_QUERY_FLAG_NUMBER 表示返回数字类型的结果;

- buffer 数组用于存储响应体数据;

- bytesRead 变量用于存储实际读取的字节数。

5. 关闭会话和连接

处理完响应之后,需要用 InternetCloseHandle 函数关闭会话和连接:


InternetCloseHandle(hRequest);

InternetCloseHandle(hConnect);

InternetCloseHandle(hSession);

完整的示例代码如下:


HINTERNET hSession = InternetOpen("MyApp", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

HINTERNET hConnect = InternetConnect(hSession, "www.example.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);

HINTERNET hRequest = HttpOpenRequest(hConnect, "GET", "/", NULL, NULL, NULL, INTERNET_FLAG_RELOAD, 0);

HttpSendRequest(hRequest, NULL, 0, NULL, 0);

DWORD statusCode = 0;

DWORD statusCodeLength = sizeof(statusCode);

HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &statusCode, &statusCodeLength, NULL);

BYTE buffer[1024];

DWORD bytesRead = 0;

while (InternetReadFile(hRequest, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0)

  // 处理响应体数据

InternetCloseHandle(hRequest);

InternetCloseHandle(hConnect);

InternetCloseHandle(hSession);

上述示例代码中使用了 GET 方法请求根路径,如果需要请求其他路径或使用 POST 方法,只需要修改 HttpOpenRequest 函数的第 2 个参数即可。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复