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

Posted

技术标签:

【中文标题】如何在 C++ 中使用 wininet 创建 POST 请求【英文标题】:How to create a POST request with wininet in C++ 【发布时间】:2019-12-30 20:54:17 【问题描述】:

我的 C++ 代码的目标是将 HTTP POST 内容发送到 php 页面,该页面会将内容写入文件。 我使用 Postman 请求测试了我的 PHP 代码,它可以工作。

问题是当我使用 C++ 客户端发送我的 POST 消息时,我的消息没有保存,所以这意味着 POST 请求格式不正确。这是代码:

void sendHello()

    LPCSTR header = "Content-Type: application/x-www-form-urlencoded";
    char lpb[1000] = "message=Hello I am here !";
    LPVOID myMessage = (LPVOID)lpb;
    HINTERNET hInternet = InternetOpenA("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET hConnection = InternetConnectA(hInternet, "127.0.0.1", 80, " ", " ", INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest  = HttpOpenRequestA(hConnection, "POST", "/message.php", NULL, NULL, NULL, 0, 1);
    HttpSendRequestA(hRequest, header, strlen(header), myMessage, sizeof(myMessage));

答案:

void sendHello()

    LPCSTR header = "Content-Type: application/x-www-form-urlencoded";
    std::string dataStr = "message=The content of the message !";
    LPVOID myMessage = (LPVOID)dataStr.c_str();
    HINTERNET hInternet = InternetOpenA("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET hConnection = InternetConnectA(hInternet, "127.0.0.1", 80, " ", " ", INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest  = HttpOpenRequestA(hConnection, "POST", "/message.php", NULL, NULL, NULL, 0, 1);
    HttpSendRequestA(hRequest, header, strlen(header), myMessage, myMessage.size());

【问题讨论】:

实际上很奇怪,sizeof(myMessage) 的输出是4。 您的“答案”应该作为真正的答案发布,而不是作为对您问题的编辑。 You can answer your own questions 【参考方案1】:

sizeof(myMessage) 只是指针的大小。这不是您的消息的大小。不要使用sizeof,除非您真的确定自己​​在做什么。

既然您使用的是 C++,请摆脱那些可怕的 char 数组,而让自己成为一个不错的 std::string。然后很容易找出数据的长度。

或者,strlen 可以在这里为您提供帮助,无需进一步修改。您已经将它用于header

此外,您没有对任何这些 WinInet 函数的结果进行任何错误检查。这很糟糕。

【讨论】:

以上是关于如何在 C++ 中使用 wininet 创建 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 wininet

WinInet C++ ftp 模板?

C++ 使用 WinINet 上传到 FTP 服务器

C++ wininet,连接weblogin,如何设置cookies?

在 C++ 中使用 Wininet 发送 POST 请求时的编码问题

C++ Wininet 自定义 http 标头