news 2026/5/1 9:51:28

C++:发送HTTP请求(附带源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++:发送HTTP请求(附带源码)

项目背景详细介绍

在现代软件系统中,HTTP 已经成为事实上的应用层通信标准协议

无论是:

  • Web 服务

  • 微服务架构

  • 云平台接口

  • RESTful API

  • 第三方平台对接(支付、地图、AI)

  • 软件更新 / 配置下发

其底层通信方式,几乎全部基于HTTP / HTTPS

对于 C++ 开发者而言,“发送 HTTP 请求”是一个绕不开但又极易被低估的能力

  • 标准库不提供 HTTP 客户端

  • 手写 HTTP 协议成本极高

  • 涉及 Header、Body、编码、超时、HTTPS 等大量细节

因此,在真实工程中,C++ 程序几乎不可能自己实现完整 HTTP 协议栈,而是统一选择成熟库方案,其中:

libcurl 是 C / C++ 领域最主流、最可靠的 HTTP 客户端库

libcurl 被广泛应用于:

  • Git

  • Docker

  • Chrome

  • 各类 Linux 系统组件

  • 大量商业软件

因此,本项目的目标是:

使用 C++ + libcurl,完整演示如何发送 HTTP GET / POST 请求,并正确获取响应结果

该示例可直接作为:

  • C++ 工程项目基础模块

  • 后台服务 HTTP 客户端

  • 第三方接口对接模板

  • 教学与博客文章

  • 面试工程能力展示


项目需求详细介绍

1. 功能需求

  1. 支持 HTTP GET 请求

  2. 支持 HTTP POST 请求

  3. 支持携带请求参数

  4. 支持获取服务器响应内容

  5. 支持基础错误处理

2. 技术要求

  1. 使用 C++

  2. 基于 libcurl 库

  3. 使用回调函数接收响应数据

  4. 支持 HTTP / HTTPS

3. 教学与工程要求

  1. 封装 HTTP 请求逻辑为独立类

  2. GET / POST 接口清晰分离

  3. 响应数据统一管理

  4. 代码结构可直接复用到真实项目


相关技术详细介绍

1. HTTP 请求基本结构

一次完整的 HTTP 请求通常包括:

  • 请求行(GET / POST + URL)

  • 请求头(Header)

  • 请求体(Body,仅 POST / PUT)

服务器返回:

  • 状态码(200 / 404 / 500)

  • 响应头

  • 响应体(数据内容)


2. libcurl 在 HTTP 中的角色

libcurl 提供了:

  • HTTP 协议封装

  • HTTPS 证书处理

  • 自动重定向

  • 超时控制

  • 数据回调机制

让开发者只需要关注:

“我发什么请求 & 我如何处理响应”


3. 回调接收响应数据

libcurl 在接收到服务器响应体时,会多次调用用户提供的回调函数:

  • 每次传输一小段数据

  • 用户负责拼接 / 保存

  • 非常适合大响应内容


实现思路详细介绍

本项目采用工程级 HTTP 客户端封装方式

  1. 初始化 libcurl 全局环境

  2. 定义 HttpClient 类

  3. 提供get()post()接口

  4. 使用回调函数接收响应数据

  5. 将响应内容保存到字符串

  6. 返回调用结果给上层

该结构具有以下优势:

  • 接口简单

  • 易于维护

  • 可无缝扩展 Header / Token / JSON

  • 可直接用于生产项目


完整实现代码

/**************************************************** * File: HttpClient.h ****************************************************/ #pragma once #include <string> class HttpClient { public: HttpClient(); ~HttpClient(); bool get(const std::string& url, std::string& response); bool post(const std::string& url, const std::string& postData, std::string& response); private: static size_t writeCallback(void* ptr, size_t size, size_t nmemb, void* userdata); }; /**************************************************** * File: HttpClient.cpp ****************************************************/ #include "HttpClient.h" #include <curl/curl.h> HttpClient::HttpClient() { curl_global_init(CURL_GLOBAL_ALL); } HttpClient::~HttpClient() { curl_global_cleanup(); } size_t HttpClient::writeCallback(void* ptr, size_t size, size_t nmemb, void* userdata) { std::string* resp = static_cast<std::string*>(userdata); resp->append(static_cast<char*>(ptr), size * nmemb); return size * nmemb; } bool HttpClient::get(const std::string& url, std::string& response) { CURL* curl = curl_easy_init(); if (!curl) return false; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); CURLcode res = curl_easy_perform(curl); curl_easy_cleanup(curl); return res == CURLE_OK; } bool HttpClient::post(const std::string& url, const std::string& postData, std::string& response) { CURL* curl = curl_easy_init(); if (!curl) return false; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); CURLcode res = curl_easy_perform(curl); curl_easy_cleanup(curl); return res == CURLE_OK; } /**************************************************** * File: main.cpp ****************************************************/ #include "HttpClient.h" #include <iostream> int main() { HttpClient client; std::string response; // GET 请求示例 if (client.get("https://httpbin.org/get", response)) std::cout << "GET Response:\n" << response << std::endl; else std::cout << "GET request failed\n"; response.clear(); // POST 请求示例 if (client.post("https://httpbin.org/post", "name=test&age=18", response)) std::cout << "POST Response:\n" << response << std::endl; else std::cout << "POST request failed\n"; return 0; }

代码详细解读(仅解读方法作用)

HttpClient

封装 HTTP 请求逻辑,对外提供 GET / POST 接口。

get

发送 HTTP GET 请求并获取响应内容。

post

发送 HTTP POST 请求,支持请求体数据。

writeCallback

libcurl 回调函数,用于接收并拼接服务器返回的数据。

curl_easy_setopt

用于配置 HTTP 请求的各种参数。


项目详细总结

通过本项目,你可以系统掌握:

  • C++ 中正确发送 HTTP 请求的工程方式

  • libcurl 的核心使用模式

  • HTTP GET / POST 请求差异

  • 为后续 REST / JSON / Token 接口打下坚实基础

这是所有 C++ 后台、工具、客户端程序的必备模块


项目常见问题及解答

Q1:支持 HTTPS 吗?
A:支持,libcurl 原生支持 HTTPS。

Q2:如何添加请求头?
A:可使用curl_slist扩展 Header。

Q3:可以发送 JSON 吗?
A:可以,POST JSON 是常见扩展。


扩展方向与性能优化

  1. JSON(nlohmann/json)集成

  2. 自定义 HTTP Header

  3. Token / Bearer 鉴权

  4. 超时与重试机制

  5. 异步 / 多线程请求

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 8:16:06

终极词库转换指南:3步实现20+输入法无缝迁移

终极词库转换指南&#xff1a;3步实现20输入法无缝迁移 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为换输入法就要重新积累词库而烦恼吗&#xff1f;每次更换…

作者头像 李华
网站建设 2026/4/22 8:07:45

【c++】模板进阶

在一些特定的情况&#xff0c;会用到常量&#xff1b;如我们需要一个定长的数组时。控制数组长度的类型时确定的&#xff08;如size_t&#xff09;&#xff0c;这样我们只设置一个类型参数就可以了。代码语言&#xff1a;javascriptAI代码解释namespace xian {//定义一个模板类…

作者头像 李华
网站建设 2026/5/1 8:01:38

SmartDock桌面启动器:5步打造专属Android工作站

SmartDock桌面启动器&#xff1a;5步打造专属Android工作站 【免费下载链接】smartdock A user-friendly desktop mode launcher that offers a modern and customizable user interface 项目地址: https://gitcode.com/gh_mirrors/smar/smartdock SmartDock是一款专为A…

作者头像 李华
网站建设 2026/5/1 7:57:38

StructBERT零样本分类器性能对比:不同文本长度的表现

StructBERT零样本分类器性能对比&#xff1a;不同文本长度的表现 1. 引言&#xff1a;AI 万能分类器的兴起与挑战 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类是构建智能系统的核心能力之一。传统方法依赖大量标注数据进行监督训练&#xff0c;成本高…

作者头像 李华
网站建设 2026/5/1 7:57:43

E-Hentai漫画下载终极指南:一键批量收藏完整教程

E-Hentai漫画下载终极指南&#xff1a;一键批量收藏完整教程 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 还在为E-Hentai上心爱的漫画无法批量下载而烦恼吗&#xf…

作者头像 李华