wininet 或 winhttp,这是 POST 请求的首选

Posted

技术标签:

【中文标题】wininet 或 winhttp,这是 POST 请求的首选【英文标题】:wininet or winhttp, which is preferred for POST requests 【发布时间】:2014-11-05 02:12:26 【问题描述】:

我正在浏览比较 WinInet 和 WinHttp 的 MSDN 页面。似乎 WinInet 的功能比 WinHttp 更多。 MSDN 页面是here。什么情况下会选择 WinHttp 而不是 WinInet?

考虑到 WinInet 具有可用于 POST 数据的 HttpSendRequest,而 WinHttp 也具有 WinHttpSendRequest。与 WinInet 相比,采用 WinHttp 有什么优势?使用 WinHttp 和 WinInet 发布数据的方式有区别吗?

此外,如果一些同时使用 WinHttp 和 WinInet 的 POST 请求示例会有所帮助,一些小的示例代码。

编辑 3 WIRESHARK 屏幕截图

EDIT 2 我终于设法从应用程序中获取了一个 HTTP_STATUS_CODE,它是 200 OK,但是在发送 post 数据时出现问题,它已发送但参数未设置。我尝试在 php 端实现此代码。

<?php

    $fp = fopen("data.txt", "a");
    fwrite($fp, "ID = " . $_POST['id']);
    fclose($fp);

?>

应用程序运行后立即创建文件,但未设置 ID 参数,它会写入文件 “ID =”,仅此而已。 10 没有通过,不知道为什么

谢谢。

编辑:链接到我尝试使用的示例。 HttpSendRequest to POST form data

【问题讨论】:

meh,当图书馆作者开始困惑时,我去 libcurl。 我知道 libcurl,但我不想使用任何库 @gbjbaanb :),感谢您的建议 真的不允许就 SO 请求图书馆推荐;话虽如此,我刚刚了解了Casablanca,它看起来非常整洁,可能值得考虑。 【参考方案1】:

其实MSDN在WinHTTP vs. WinINet上有一个不错的页面,说明:

除了少数例外,WinINet 是 WinHTTP 的超集。在两者之间进行选择时,您应该使用 WinINet,除非您计划在需要模拟和会话隔离的服务或类似服务的进程中运行。

【讨论】:

我知道了,但我在另一个网站上的一篇文章中读到,应该使用 WinHttp 进行 POST 请求,我尝试使用 WinInet 进行 POST 请求,但没有成功 好吧,我已经使用 MFC Wininet 类 CHttpConnection 和 CHttpFile 来发出 POST 请求,你能提供一个失败的代码吗?这样就更容易理解你做错了什么。 我编辑了问题,并且示例的链接在那里,这是关于 SO 的另一个问题,但它不起作用。 @David,仔细阅读链接给了我与 cmets 中提到的相同的结论——这种情况将不起作用,因为您无法从一个完全不同的 GET 请求中的请求中获取 POST 内容。你能描述一下你想要做什么的场景吗?上传一个文件?只是做一个简单的POST?如果您尝试上传某些东西,请将 php 或另一端的任何东西保存在某处并验证它。如果它只是一个普通的请求,一个 200 OK 响应就足够了。您还可以使用 Wireshark 验证实际发布数据。 我正在尝试模拟用户登录的 POST 请求。所以表单应该填写应用程序发布的参数并从应用程序登录。【参考方案2】:

This 示例应该可以帮助您,如果您对 WinInet 示例感兴趣,可以查看here。

此外,来自 MSDN 的关于 WinInet 的引用:

注意 WinINet 不支持服务器实现。此外,不应从服务中使用它。对于服务器实现或服务,请使用 Microsoft Windows HTTP 服务 (WinHTTP)。

这是个好建议。

【讨论】:

以上是关于wininet 或 winhttp,这是 POST 请求的首选的主要内容,如果未能解决你的问题,请参考以下文章

任何人都知道为啥这个带有 WinHttp 的 POST 失败了

使用 WinInet 的客户端身份验证(证书 + 私钥)

未收到 WinHttp POST 正文

有没有在 Windows 上用 C 语言使用 winhttp 的完整例子?

如何在 C++ 中使用 wininet 创建 POST 请求

C++ WinINet InternetReadFile函数刷新