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\n1. 使用 libcurl 的 HTTP 客户端
\n\nlibcurl 是一个经过多年验证的库,支持 HTTP、HTTPS、FTP 等多种协议。它易于使用且文档完善。
\n\n安装 libcurl
\n\n对于 Linux (Ubuntu/Debian):
\nsudo apt-get install libcurl4-openssl-dev\n\n对于 Windows,可以从 curl.se 官方网站下载预编译的二进制文件,或使用 vcpkg:
\nvcpkg 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 标志:
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