C++ HTTP客户端:正确发起请求

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

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

开始课程

引言:为什么要在 C++ 中编写 HTTP 客户端?



在现代开发中,与远程服务器交互是一项关键任务。无论是从 REST API 获取数据、向服务器发送表单还是下载文件,都会用到 HTTP 协议。尽管 Python 和 JavaScript 提供了简单的内置解决方案,但 C++ 在编写高性能 HTTP 客户端方面仍然不可或缺。这对于嵌入式系统、游戏引擎、高负载后端或仅仅是为了学习底层网络机制都是必要的。



在本文中,我们将探讨在 C++ 中实现 HTTP 客户端的两种流行方法:使用 libcurl (cURL) 库,以及使用 Boost.Beast 的更现代异步方法。您将学习如何正确构造 GET 和 POST 请求、处理响应以及避免常见错误。



1. 经典方法:使用 libcurl 的 C++ HTTP 客户端



libcurl 库是一个久经考验的工具,用于通过各种协议传输数据。它支持 HTTP/1.1、HTTP/2、HTTPS、认证、Cookie 等等。对于 C++,有一个方便的包装器 curl/curl.h,可以轻松地将 cURL 集成到您的项目中。



安装 libcurl

在大多数 Linux 发行版中,cURL 已经安装。开发需要开发包:

sudo apt-get install libcurl4-openssl-dev  # Ubuntu/Debianbrew install curl                          # macOS


示例:GET 请求

让我们编写一个简单的 C++ HTTP 客户端,从公共 API(例如 JSONPlaceholder)获取数据。

#include <iostream>#include <string>#include <curl/curl.h>

// 用于将数据写入 std::string 的回调函数static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb;}

int main() { CURL *curl; CURLcode res; std::string readBuffer;

curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init();

if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); // 执行请求 res = curl_easy_perform(curl); if(res != CURLE_OK) { std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; } else { std::cout << "服务器响应:" << readBuffer << std::endl; } curl_easy_cleanup(curl); } curl_global_cleanup(); return 0;}


示例:带 JSON 的 POST 请求

现在让我们向服务器发送数据。为此,需要指定内容类型和请求体。

#include <iostream>#include <string>#include <curl/curl.h>

int main() { CURL *curl; CURLcode res; std::string response; // 要发送的 JSON 数据 std::string jsonData = R"({"title": "foo", "body": "bar", "userId": 1})"; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str()); // 设置请求头 struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 用于写入响应的回调函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, [](void *contents, size_t size, size_t nmemb, void *userp) -> siz

博客

书籍推荐