c++ http请求方法 c++如何发送http get和post请求

酷宇大大_7566

酷宇大大_7566

2026-03-20

1162人浏览

原创

用 libcurl 发 get 请求最稳,因其自动处理重定向、gzip、ssl、连接复用和超时;需正确调用 curl_global_init/cleanup,设置 url、超时及 writefunction 捕获响应。

c++ http请求方法 c++如何发送http get和post请求

用 libcurl 发 GET 请求最稳,别碰裸 socket

直接写 socket 拼 HTTP 报文看似可控,实际要手动处理重定向、gzip 解压、SSL 验证、连接复用、超时逻辑——99% 的项目不值得为这点“控制感”付出维护成本。libcurl 是 C++ 做 HTTP 最现实的选择,C API 但 C++ 调用完全没问题。

常见错误:漏掉 curl_global_init(CURL_GLOBAL_DEFAULT),导致首次调用 curl_easy_init() 返回 nullptr;或者没设 CURLOPT_FOLLOWLOCATION,302 重定向就卡住。

  • 必须在程序启动时调一次 curl_global_init(CURL_GLOBAL_DEFAULT),退出前调 curl_global_cleanup()
  • GET 请求只需设 CURLOPT_URL 和 CURLOPT_HTTPGET(或留空,GET 是默认方法)
  • 加 CURLOPT_TIMEOUT 和 CURLOPT_CONNECTTIMEOUT,否则 DNS 卡住会挂死几十秒
  • 响应体默认输出到 stdout,务必用 CURLOPT_WRITEFUNCTION + CURLOPT_WRITEDATA 捕获到 std::string 或 std::vector<char></char>

POST 提交 JSON 时 Content-Type 和数据格式不能错

发 JSON 不是把字符串塞进 CURLOPT_POSTFIELDS 就完事。Content-Type 缺失或写成 application/x-www-form-urlencoded,后端很可能收不到 body 或解析失败。

典型现象:后端日志显示收到空 body,或报 “invalid JSON”,但用 curl 命令行能通——大概率是 C++ 代码里没设 header 或数据指针生命周期出问题。

  • 必须显式设置 header:struct curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  • CURLOPT_POSTFIELDS 接的是 const char*,确保传入的 JSON 字符串内存有效(别传局部 std::string::c_str() 后立刻析构)
  • 如果用 std::string json_str = R"({"key":"val"})";,传 json_str.c_str() 是安全的,但得保证 json_str 生命周期覆盖整个 curl_easy_perform() 调用
  • 不要用 CURLOPT_POST + CURLOPT_POSTFIELDSIZE 组合来发 JSON,容易因长度计算错误截断

Windows 下链接 libcurl 容易缺 -lcurl 或 SSL 库

Linux/macOS 用 pkg-config --libs libcurl 一般能拉全依赖;Windows 上 MinGW 或 MSVC 手动链接时,漏库就直接报 undefined reference to 'curl_easy_init' 或更诡异的 SSL 相关符号找不到。

C++14
C++14

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

下载

常见错误:只加了 -lcurl,但没连 -lssl -lcrypto(OpenSSL 版本)或 -lws2_32 -lwldap32(Windows SChannel 版本);或者用了静态链接但没定义 CURL_STATICLIB 宏。

  • MinGW:除了 -lcurl,至少补 -lssl -lcrypto -lz -lnghttp2(按你编译 libcurl 时启用的特性选)
  • MSVC:用预编译二进制时,确认下载的是带 OpenSSL 的版本(不是 WinSSL),并把 libcurl.lib、libeay32.lib、ssleay32.lib 全加进 linker input
  • 用 CMake 时,优先走 find_package(CURL REQUIRED),比手写 target_link_libraries 少踩一半坑

异步请求?别自己撸线程池,先看 curl_multi

想并发发 10 个请求,第一反应是开 10 个线程各跑一个 curl_easy_perform()——这会吃光文件描述符、触发 TCP TIME_WAIT 爆满、还难统一管理超时和取消。

curl_multi 是 libcurl 内置的多路复用接口,基于 select/poll/epoll/kqueue,单线程就能高效并发。但它不是“开箱即用”,得自己轮询事件、处理完成回调。

  • 初始化用 curl_multi_init(),每个请求仍需独立的 CURL* 句柄,再用 curl_multi_add_handle() 挂进去
  • 主循环里调 curl_multi_perform() 触发 I/O,再用 curl_multi_info_read() 检查哪些完成了
  • 别在回调里做耗时操作(比如解析 JSON),只存结果、发信号,让主线程处理
  • 如果已有 event loop(如 Qt 的 QEventLoop 或 libuv),可用 curl_multi_socket_action() 接入,避免阻塞

真正麻烦的从来不是发请求本身,而是怎么让一堆请求不互相干扰、超时能及时回收、错误能准确定位到具体哪个 URL——这些细节藏在 curl_multi 的状态机和回调里,文档里不会明说,但绕不开。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

2025.08.15

4902

7

C++桌面程序开发
C++桌面程序开发

本专题聚焦 C++ 在桌面端图形界面应用开发中的实战应用,系统讲解 Qt 框架的信号与槽机制、界面布局管理、事件响应、数据交互、样式美化与多窗口应用设计等核心知识。通过实战案例(如记事本应用、数据管理工具、系统监控面板),帮助学习者掌握 从UI设计到完整桌面软件开发的C++工程化能力。

2025.10.23

1354

13

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

2025.12.05

1421

15

json数据格式
json数据格式

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

2023.08.07

2135

5

json是什么
json是什么

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

2023.08.23

3262

1

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

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

2023.10.13

1096

3

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

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

2025.09.10

3719

7

string转int
string转int

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

2023.08.02

6359

3

curl_exec
curl_exec

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

2023.06.14

3623

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习