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

易语言 post访问网页 无界面
(图片来源网络,侵删)
  1. 使用WinINet API:这是Windows系统自带的网络组件,无需额外文件,兼容性好,但代码相对繁琐。
  2. 使用WinHttp API:这是微软推荐的、更现代的HTTP客户端API,专为网络设计,性能更好,代码也更简洁,是目前的主流选择。

强烈推荐使用第二种方法(WinHttp),因为它更稳定、更高效。


使用 WinHttp API (推荐)

这是最常用且推荐的方法,我们需要调用 Windows 的 WinHttp.dll 中的几个核心函数。

核心思路:

  1. 使用 WinHttpOpen 初始化会话。
  2. 使用 WinHttpConnect 连接到目标服务器(www.example.com)。
  3. 使用 WinHttpOpenRequest 创建一个HTTP请求,并设置请求方法为 POST
  4. 使用 WinHttpAddRequestHeaders 添加必要的请求头,如 Content-Type
  5. 使用 WinHttpSendRequest 发送请求。
  6. 使用 WinHttpWriteData 将POST数据发送到服务器。
  7. 使用 WinHttpReceiveResponse 等待服务器响应。
  8. 使用 WinHttpReadData 循环读取服务器返回的数据。
  9. 使用 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类似,但设计上更偏向于用户交互,因此在无界面程序中使用可能会有些问题。

易语言 post访问网页 无界面
(图片来源网络,侵删)

核心思路:

  1. InternetOpen: 初始化。
  2. InternetConnect: 连接服务器。
  3. HttpOpenRequest: 打开请求。
  4. HttpAddRequestHeaders: 添加头。
  5. HttpSendRequestEx: 异步准备发送请求。
  6. InternetWriteFile: 写入POST数据。
  7. HttpEndRequest: 结束发送。
  8. InternetReadFile: 循环读取响应数据。
  9. InternetCloseHandle: 关闭句柄。

由于代码比WinHttp更复杂,且容易遇到各种兼容性问题(在Windows 10上可能表现不佳),这里就不提供完整代码了,如果你感兴趣,可以查阅MSDN上的相关文档进行尝试。


总结与建议

特性 WinHttp API WinINet API
推荐度 ⭐⭐⭐⭐⭐ (强烈推荐) ⭐ (不推荐)
设计用途 通用HTTP/HTTPS客户端 面向IE浏览器的客户端
性能 高,专为网络优化 较低,有额外开销
无界面支持 完美支持 支持但可能不稳定
依赖 Windows系统自带 Windows系统自带
代码复杂度 相对简单 相对复杂

请直接使用 方法一(WinHttp API),它是目前无界面网络请求的最佳实践,代码清晰、稳定高效。

易语言 post访问网页 无界面
(图片来源网络,侵删)