C++ HTTP 客户端:从 A 到 Z 正确发出请求

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ HTTP 客户端:从 A 到 Z 正确发出请求

\n\n

在现代软件开发中,通过 HTTP 与远程服务器交互是一项基本技能。无论是从 API 下载数据、提交表单还是与 Web 服务协作,C++ 都提供了几种强大的工具来创建 HTTP 客户端。在本文中,我们将探讨如何在 C++ 中正确发出 HTTP 请求,介绍流行的库,并编写可运行的代码示例。

\n\n

为什么选择 C++ 进行 HTTP 请求?

\n\n

与 Python 或 JavaScript 不同,C++ 的标准库中没有内置的 HTTP 支持。但这并不是问题:有一些久经考验的库可以让你轻松高效地发送请求。主要选项包括:

\n\n
    \n
  • libcurl (cURL) — 最流行的跨平台库。
  • \n
  • Boost.Beast — 基于 Boost.Asio 的现代库。
  • \n
  • WinHTTP — Windows 的内置解决方案。
  • \n
  • Qt Network — 用于 Qt 项目。
  • \n
\n\n

本文将重点介绍前两个,因为它们最通用,适用于大多数任务。

\n\n

1. 使用 libcurl 的 HTTP 客户端

\n\n

libcurl 是一个经过多年验证的库,支持 HTTP、HTTPS、FTP 等多种协议。它易于使用且文档完善。

\n\n

安装 libcurl

\n\n

对于 Linux (Ubuntu/Debian):

\n
sudo apt-get install libcurl4-openssl-dev
\n\n

对于 Windows,可以从 curl.se 官方网站下载预编译的二进制文件,或使用 vcpkg:

\n
vcpkg install curl
\n\n

简单的 GET 请求

\n\n

让我们编写一个从服务器获取数据的基本示例:

\n\n
#include <iostream>\n#include <string>\n#include <curl/curl.h>\n\n// 用于写入数据的回调函数\nstatic size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {\n    size_t totalSize = size * nmemb;\n    output->append((char*)contents, totalSize);\n    return totalSize;\n}\n\nint main() {\n    CURL* curl = curl_easy_init();\n    if (!curl) {\n        std::cerr << "CURL 初始化错误" << std::endl;\n        return 1;\n    }\n\n    std::string response;\n    curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1");\n    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);\n    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);\n    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // 测试时禁用 SSL 验证\n\n    CURLcode res = curl_easy_perform(curl);\n    if (res != CURLE_OK) {\n        std::cerr << "请求错误: " << curl_easy_strerror(res) << std::endl;\n    } else {\n        std::cout << "服务器响应:\\n" << response << std::endl;\n    }\n\n    curl_easy_cleanup(curl);\n    return 0;\n}
\n\n

编译时需要添加 -lcurl 标志:

\n
g++ -o http_client http_client.cpp -lcurl
\n\n

发送 JSON 的 POST 请求

\n\n

现在添加数据发送功能:

\n\n
#include <iostream>\n#include <string>\n#include <curl/curl.h>\n\nint main() {\n    CURL* curl = curl_easy_init();\n    if (!curl) return 1;\n\n    std::string response;\n    std::string jsonData = R"({"title": "foo", "body": "bar", "userId": 1})";\n\n    struct curl_slist* headers = nullptr;\n    headers = curl_slist_append(headers, "Content-Type: application/json");\n\n    curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");\n    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str());\n    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\n    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCal                

博客

书籍推荐