讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现简单的HTTP客户端?(socket或libcurl封装)

老雪吖_5669

老雪吖_5669

发布时间:2026-02-24 13:46:03

|

1025人浏览过

|

来源于php中文网

原创

用libcurl实现HTTP请求最稳,因其自动处理重定向、chunked编码、TLS握手等复杂细节;手写socket易遇CURLE_RECV_ERROR或响应截断;需正确初始化、设URL协议前缀、启用跳转、用WRITEFUNCTION攒整块响应体、POST时先设POSTFIELDS再设JSON头、Windows下须指定CA证书路径。

c++如何实现简单的http客户端?(socket或libcurl封装)

用 libcurl 实现 GET 请求最稳,别手写 socket

直接上 libcurl,不是因为它“高级”,而是因为 HTTP 协议细节太多:重定向、chunked 编码、TLS 握手、header 大小限制、连接复用……手写 socket 容易在 CURLcode 返回 CURLE_RECV_ERROR 或静默截断响应时卡住半天。生产环境或快速验证,libcurl 是事实标准。

实操建议:

  • 链接时加 -lcurl,头文件只用 #include <curl></curl>
  • 必须调用 curl_global_init(CURL_GLOBAL_DEFAULT) 一次(通常在 main 开头)
  • curl_easy_setopt(handle, CURLOPT_URL, "https://httpbin.org/get") 的 URL 必须带协议前缀,否则默认走 ftp
  • 设 CURLOPT_FOLLOWLOCATION 为 1L 才能自动跳转,否则 302 响应体就是空的
  • 用 CURLOPT_WRITEFUNCTION + CURLOPT_WRITEDATA 捕获响应体,别依赖 CURLOPT_HEADER——它只控制是否打印到 stdout,不存进你的 buffer

callback 函数里别直接 push_back 到 vector

常见错误是写一个 std::vector<:string> response_lines</:string>,然后在 write_callback 里做 response_lines.push_back(std::string(ptr, size))。问题在于:HTTP 响应体不按行分割,ptr 指向的是原始字节流,可能中途断在 UTF-8 多字节字符中间,也可能把一个 JSON 对象切成两段传进来。

正确做法是攒整块数据:

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 声明 std::string response_body 作为 CURLOPT_WRITEDATA 的目标
  • callback 写成:
    size_t write_callback(void* ptr, size_t size, size_t nmemb, void* userdata) {
      std::string* buf = static_cast<std::string*>(userdata);
      buf->append(static_cast<char*>(ptr), size * nmemb);
      return size * nmemb;
    }
  • 不要在 callback 里做解析、日志、网络调用——它可能被调用十几次,且不在主线程上下文(多线程模式下)

POST JSON 时 Content-Type 和 CURLOPT_POSTFIELDS 的顺序不能错

发 JSON 最容易 400 错误,根本原因不是 payload 写错了,而是 header 设置时机不对。libcurl 默认对 CURLOPT_POSTFIELDS 自动加 Content-Type: application/x-www-form-urlencoded,覆盖你手动设的 JSON 类型。

必须按这个顺序写:

  • 先设 CURLOPT_POSTFIELDS(或 CURLOPT_COPYPOSTFIELDS)
  • 再设 CURLOPT_HTTPHEADER,传入 struct curl_slist*,例如:
    struct curl_slist* headers = nullptr;
    headers = curl_slist_append(headers, "Content-Type: application/json");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  • 如果用 CURLOPT_POSTFIELDS,记得 payload 必须是 const char* 且生命周期覆盖整个请求;更安全用 CURLOPT_COPYPOSTFIELDS,它会内部拷贝
  • 别漏掉 CURLOPT_POST 设为 1L,否则即使有 post fields 也发成 GET

Windows 下 curl_easy_perform 返回 CURLE_SSL_CACERT 要手动指定 CA

Linux/macOS 通常自带系统 CA bundle,Windows 的 libcurl 静态链接版默认找不到证书路径,curl_easy_perform 直接返回 CURLE_SSL_CACERT,连 DNS 都没开始查。

解决方法只有两个有效:

  • 下载 curl-ca-bundle.crt(官方提供),然后:
    curl_easy_setopt(curl, CURLOPT_CAINFO, "path/to/curl-ca-bundle.crt");
  • 或者关校验(仅测试用):
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
  • 注意 CURLOPT_SSL_VERIFYHOST 设为 0L 不等于 2L(旧版默认值),设成 2L 仍会校验域名,设成 0L 才彻底跳过

跨平台项目里,CA 路径最好通过配置或环境变量传入,硬编码路径在用户机器上大概率失效。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2255

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3622

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1216

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4179

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7079

2023.08.02

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

3823

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

895

2023.10.30

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2358

2023.09.20

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP使用CURL抓取页面
PHP使用CURL抓取页面

共4课时 | 3.1万人学习

前端最全HTTP基础原理及应用
前端最全HTTP基础原理及应用

共12课时 | 2.1万人学习

C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn