这里为您提供两种最主流、最可靠的方法:

(图片来源网络,侵删)
- 使用
WinINetAPI:这是Windows系统自带的网络组件,无需额外文件,兼容性好,但代码相对繁琐。 - 使用
WinHttpAPI:这是微软推荐的、更现代的HTTP客户端API,专为网络设计,性能更好,代码也更简洁,是目前的主流选择。
强烈推荐使用第二种方法(WinHttp),因为它更稳定、更高效。
使用 WinHttp API (推荐)
这是最常用且推荐的方法,我们需要调用 Windows 的 WinHttp.dll 中的几个核心函数。
核心思路:
- 使用
WinHttpOpen初始化会话。 - 使用
WinHttpConnect连接到目标服务器(www.example.com)。 - 使用
WinHttpOpenRequest创建一个HTTP请求,并设置请求方法为POST。 - 使用
WinHttpAddRequestHeaders添加必要的请求头,如Content-Type。 - 使用
WinHttpSendRequest发送请求。 - 使用
WinHttpWriteData将POST数据发送到服务器。 - 使用
WinHttpReceiveResponse等待服务器响应。 - 使用
WinHttpReadData循环读取服务器返回的数据。 - 使用
WinHttpCloseHandle关闭所有打开的句柄,释放资源。
完整代码示例:
.版本 2
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.局部变量 hSession, 整数型
.局部变量 hConnect, 整数型
.局部变量 hRequest, 整数型
.局部变量 bResults, 逻辑型
.局部变量 dwSize, 整数型
.局部变量 dwDownloaded, 整数型
.局部变量 pszOutBuffer, 文本型, , "0"
.局部变量 PostData, 文本型
.局部变量 PostDataSize, 整数型
' --- 1. 准备POST数据 ---
' 数据通常是 "key1=value1&key2=value2" 的格式
PostData = "username=testuser&password=testpassword"
PostDataSize = 取文本长度 (PostData)
' --- 2. 初始化WinHttp会话 ---
' WINHTTP_ACCESS_TYPE_DEFAULT = 0
hSession = WinHttpOpen (“My易语言App”, 0, , , 0)
' 如果初始化失败
.(hSession = 0)
信息框 (“WinHttpOpen初始化失败!”, 0, , )
返回 ()
.否则
' --- 3. 连接到目标服务器 ---
' 参数:会话句柄, 服务器主机名, 端口号 (80为HTTP, 443为HTTPS), NULL, NULL, 0
hConnect = WinHttpConnect (hSession, “httpbin.org”, 80, , )
' 如果连接失败
.(hConnect = 0)
信息框 (“连接服务器失败!错误码: ” + 到文本 (GetLastError ()), 0, , )
跳到 (关闭句柄)
.否则
' --- 4. 创建POST请求 ---
' 参数:连接句柄, 路径, NULL (没有代理), NULL (没有 bypass), 0
hRequest = WinHttpOpenRequest (hConnect, “POST”, “/post”, , , , 0)
' 如果创建请求失败
.(hRequest = 0)
信息框 (“创建请求失败!错误码: ” + 到文本 (GetLastError ()), 0, , )
跳到 (关闭句柄)
.否则
' --- 5. 添加请求头 ---
' Content-Type: application/x-www-form-urlencoded 是最常见的表单提交格式
' WINHTTP_ADDREQ_FLAG_ADD = &H20000000
bResults = WinHttpAddRequestHeaders (hRequest, “Content-Type: application/x-www-form-urlencoded”, -1, &H20000000)
' --- 6. 发送请求和数据 ---
' 参数:请求句柄, 是否包含请求头, POST数据, POST数据大小
' 注意:这里直接把数据和请求一起发走,也可以分开发送
bResults = WinHttpSendRequest (hRequest, , -1, PostData, PostDataSize, PostDataSize, 0)
' 如果发送失败
.(bResults = 假)
信息框 (“发送请求失败!错误码: ” + 到文本 (GetLastError ()), 0, , )
跳到 (关闭句柄)
.否则
' --- 7. 接收服务器响应 ---
bResults = WinHttpReceiveResponse (hRequest, 0)
' 如果接收响应失败
.(bResults = 假)
信息框 (“接收响应失败!错误码: ” + 到文本 (GetLastError ()), 0, , )
跳到 (关闭句柄)
.否则
' --- 8. 循环读取返回的数据 ---
' 首先获取数据大小
dwSize = 4096 ' 初始缓冲区大小
.循环判断首 ()
' 重新分配内存以容纳数据
.(取文本长度 (pszOutBuffer) < dwSize)
pszOutBuffer = 取空白文本 (dwSize)
.否则
.如果结束
' 读取数据
bResults = WinHttpReadData (hRequest, pszOutBuffer, dwSize, @dwDownloaded)
' 如果读取失败或没有数据了
.(bResults = 假 或 dwDownloaded = 0)
跳出循环 ()
.否则
' 截取实际读取到的数据
pszOutBuffer = 取文本左边 (pszOutBuffer, dwDownloaded)
' 这里可以处理数据,比如追加到另一个变量中
' 为了演示,我们直接显示在信息框里
.(到整数 (pszOutBuffer) = 0) ' 避免重复弹窗
信息框 (“服务器返回数据:”, 0, , )
输出调试文本 (pszOutBuffer)
.如果结束
.如果结束
.循环尾 ()
.如果结束
.如果结束
.如果结束
.如果结束
.否则
.如果结束
' --- 资源清理 ---
关闭句标:
.(hRequest ≠ 0)
WinHttpCloseHandle (hRequest)
.如果结束
.(hConnect ≠ 0)
WinHttpCloseHandle (hConnect)
.如果结束
.(hSession ≠ 0)
WinHttpCloseHandle (hSession)
.如果结束
.子程序 关闭句标
.局部变量 hRequest, 整数型
.局部变量 hConnect, 整数型
.局部变量 hSession, 整数型
hRequest = hRequest
hConnect = hConnect
hSession = hSession
.(hRequest ≠ 0)
WinHttpCloseHandle (hRequest)
.如果结束
.(hConnect ≠ 0)
WinHttpCloseHandle (hConnect)
.如果结束
.(hSession ≠ 0)
WinHttpCloseHandle (hSession)
.如果结束
返回 ()
.版本 2
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.局部变量 hSession, 整数型
.局部变量 hConnect, 整数型
.局部变量 hRequest, 整数型
.局部变量 bResults, 逻辑型
.局部变量 dwSize, 整数型
.局部变量 dwDownloaded, 整数型
.局部变量 pszOutBuffer, 文本型, , "0"
.局部变量 PostData, 文本型
.局部变量 PostDataSize, 整数型
' --- 1. 准备POST数据 ---
' 数据通常是 "key1=value1&key2=value2" 的格式
PostData = "username=testuser&password=testpassword"
PostDataSize = 取文本长度 (PostData)
' --- 2. 初始化WinHttp会话 ---
' WINHTTP_ACCESS_TYPE_DEFAULT = 0
hSession = WinHttpOpen (“My易语言App”, 0, , , 0)
' 如果初始化失败
.(hSession = 0)
信息框 (“WinHttpOpen初始化失败!”, 0, , )
返回 ()
.否则
' --- 3. 连接到目标服务器 ---
' 参数:会话句柄, 服务器主机名, 端口号 (80为HTTP, 443为HTTPS), NULL, NULL, 0
hConnect = WinHttpConnect (hSession, “httpbin.org”, 80, , )
' 如果连接失败
.(hConnect = 0)
信息框 (“连接服务器失败!错误码: ” + 到文本 (GetLastError ()), 0, , )
跳到 (关闭句柄)
.否则
' --- 4. 创建POST请求 ---
' 参数:连接句柄, 路径, NULL (没有代理), NULL (没有 bypass), 0
hRequest = WinHttpOpenRequest (hConnect, “POST”, “/post”, , , , 0)
' 如果创建请求失败
.(hRequest = 0)
信息框 (“创建请求失败!错误码: ” + 到文本 (GetLastError ()), 0, , )
跳到 (关闭句柄)
.否则
' --- 5. 添加请求头 ---
' Content-Type: application/x-www-form-urlencoded 是最常见的表单提交格式
' WINHTTP_ADDREQ_FLAG_ADD = &H20000000
bResults = WinHttpAddRequestHeaders (hRequest, “Content-Type: application/x-www-form-urlencoded”, -1, &H20000000)
' --- 6. 发送请求和数据 ---
' 参数:请求句柄, 是否包含请求头, POST数据, POST数据大小
' 注意:这里直接把数据和请求一起发走,也可以分开发送
bResults = WinHttpSendRequest (hRequest, , -1, PostData, PostDataSize, PostDataSize, 0)
' 如果发送失败
.(bResults = 假)
信息框 (“发送请求失败!错误码: ” + 到文本 (GetLastError ()), 0, , )
跳到 (关闭句柄)
.否则
' --- 7. 接收服务器响应 ---
bResults = WinHttpReceiveResponse (hRequest, 0)
' 如果接收响应失败
.(bResults = 假)
信息框 (“接收响应失败!错误码: ” + 到文本 (GetLastError ()), 0, , )
跳到 (关闭句柄)
.否则
' --- 8. 循环读取返回的数据 ---
' 首先获取数据大小
dwSize = 4096 ' 初始缓冲区大小
.循环判断首 ()
' 重新分配内存以容纳数据
.(取文本长度 (pszOutBuffer) < dwSize)
pszOutBuffer = 取空白文本 (dwSize)
.否则
.如果结束
' 读取数据
bResults = WinHttpReadData (hRequest, pszOutBuffer, dwSize, @dwDownloaded)
' 如果读取失败或没有数据了
.(bResults = 假 或 dwDownloaded = 0)
跳出循环 ()
.否则
' 截取实际读取到的数据
pszOutBuffer = 取文本左边 (pszOutBuffer, dwDownloaded)
' 这里可以处理数据,比如追加到另一个变量中
' 为了演示,我们直接显示在信息框里
.(到整数 (pszOutBuffer) = 0) ' 避免重复弹窗
信息框 (“服务器返回数据:”, 0, , )
输出调试文本 (pszOutBuffer)
.如果结束
.如果结束
.循环尾 ()
.如果结束
.如果结束
.如果结束
.如果结束
.否则
.如果结束
' --- 资源清理 ---
关闭句柄:
.(hRequest ≠ 0)
WinHttpCloseHandle (hRequest)
.如果结束
.(hConnect ≠ 0)
WinHttpCloseHandle (hConnect)
.如果结束
.(hSession ≠ 0)
WinHttpCloseHandle (hSession)
.如果结束
代码说明:
httpbin.org: 这是一个非常方便的测试网站,它会把你POST过去的数据和请求头等信息原样返回给你,方便我们调试。Content-Type: 这个头非常重要,它告诉服务器你发送的是什么类型的数据。application/x-www-form-urlencoded是标准的表单提交格式,如果你要发送JSON数据,就应该设置为application/json。GetLastError(): 这是一个系统API,当WinHttp函数返回失败时,可以用它来获取具体的错误码,方便排查问题。- 资源释放: 最后一定要记得关闭所有打开的句柄,否则会导致内存泄漏。
使用 WinINet API (不推荐,仅作了解)
WinINet 是老版的API,通常用于IE浏览器,它的功能与WinHttp类似,但设计上更偏向于用户交互,因此在无界面程序中使用可能会有些问题。

(图片来源网络,侵删)
核心思路:
InternetOpen: 初始化。InternetConnect: 连接服务器。HttpOpenRequest: 打开请求。HttpAddRequestHeaders: 添加头。HttpSendRequestEx: 异步准备发送请求。InternetWriteFile: 写入POST数据。HttpEndRequest: 结束发送。InternetReadFile: 循环读取响应数据。InternetCloseHandle: 关闭句柄。
由于代码比WinHttp更复杂,且容易遇到各种兼容性问题(在Windows 10上可能表现不佳),这里就不提供完整代码了,如果你感兴趣,可以查阅MSDN上的相关文档进行尝试。
总结与建议
| 特性 | WinHttp API | WinINet API |
|---|---|---|
| 推荐度 | ⭐⭐⭐⭐⭐ (强烈推荐) | ⭐ (不推荐) |
| 设计用途 | 通用HTTP/HTTPS客户端 | 面向IE浏览器的客户端 |
| 性能 | 高,专为网络优化 | 较低,有额外开销 |
| 无界面支持 | 完美支持 | 支持但可能不稳定 |
| 依赖 | Windows系统自带 | Windows系统自带 |
| 代码复杂度 | 相对简单 | 相对复杂 |
请直接使用 方法一(WinHttp API),它是目前无界面网络请求的最佳实践,代码清晰、稳定高效。

(图片来源网络,侵删)
