c++开发之网络篇curl

news/2024/9/28 4:34:07/

libcurl 是一个功能强大的库,常用于在 C 和 C++ 程序中执行 HTTP 请求、处理 URL 资源。下面是关于如何在 C++ 中使用 libcurl 的详细指南,以及一个基础的示例代码。

1. 安装 libcurl

在使用之前,确保你已经安装了 libcurl 库。根据操作系统,安装方式不同:

Ubuntu / Debian:

sudo apt-get install libcurl4-openssl-dev

CentOS / RHEL:

sudo yum install libcurl-devel

Windows: 可以使用 vcpkg 进行安装。

2. 编译 C++ 代码时链接 libcurl

编译时需要链接 libcurl,可以在编译时添加 -lcurl 选项。

g++ your_program.cpp -o your_program -lcurl

3. 基本的 HTTP 请求操作

GET 请求

GET 请求是最常见的 HTTP 操作,用来从服务器获取资源。下面是一个 GET 请求的简单例子:

#include <iostream>
#include <curl/curl.h>// 回调函数,libcurl会将服务器的响应传递给这个函数
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 response_string;// 初始化curl环境curl_global_init(CURL_GLOBAL_DEFAULT);// 初始化curl句柄curl = curl_easy_init();if (curl){// 设置目标URLcurl_easy_setopt(curl, CURLOPT_URL, "http://example.com");// 将响应数据写入到response_stringcurl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);// 执行GET请求res = curl_easy_perform(curl);// 检查返回的状态码if (res != CURLE_OK){std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;}else{// 打印响应std::cout << "Response: " << response_string << std::endl;}// 清理curl句柄curl_easy_cleanup(curl);}// 全局清理curl_global_cleanup();return 0;
}
关键步骤说明:
  • curl_easy_init():初始化一个 CURL 句柄。
  • curl_easy_setopt():设置 CURL 请求的各种选项,例如 URL、回调函数等。
  • curl_easy_perform():执行请求并接收服务器响应。
  • curl_easy_cleanup():释放 CURL 句柄。
  • curl_global_init() 和 curl_global_cleanup():在整个程序中只需要调用一次,分别用于全局初始化和清理。
POST 请求

POST 请求用于将数据提交到服务器,例如表单数据提交。下面是一个 POST 请求的例子:

#include <iostream>
#include <curl/curl.h>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 response_string;curl_global_init(CURL_GLOBAL_DEFAULT);curl = curl_easy_init();if (curl){// 设置URLcurl_easy_setopt(curl, CURLOPT_URL, "http://example.com/login");// 指定为POST请求curl_easy_setopt(curl, CURLOPT_POST, 1L);// 设置POST字段curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=user&password=pass");// 设置写回调函数curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);// 执行POST请求res = curl_easy_perform(curl);if (res != CURLE_OK){std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;}else{std::cout << "Response: " << response_string << std::endl;}curl_easy_cleanup(curl);}curl_global_cleanup();return 0;
}
关键步骤说明:
  • curl_easy_setopt(curl, CURLOPT_POST, 1L):指定 POST 请求。
  • curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data"):设置 POST 字段。

4. 常用 libcurl 选项

  • CURLOPT_URL:设置请求的 URL。
  • CURLOPT_WRITEFUNCTION:指定响应回调函数,用于处理服务器返回的数据。
  • CURLOPT_WRITEDATA:指定传递给回调函数的用户数据。
  • CURLOPT_POST:将请求设置为 POST
  • CURLOPT_POSTFIELDS:设置 POST 请求的数据。
  • CURLOPT_HTTPHEADER:设置自定义 HTTP 头部。
  • CURLOPT_TIMEOUT:设置请求的超时时间。
  • CURLOPT_FOLLOWLOCATION:自动跟踪重定向。

5. 处理 HTTP 头部

可以通过 CURLOPT_HTTPHEADER 来设置自定义的 HTTP 头部。例如,添加 Content-Type: application/json 头部。

struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

6. SSL 支持

如果你想使用 HTTPS 连接,可以使用以下选项来忽略 SSL 证书验证(不推荐在生产环境中使用):

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);

7. 完整编译示例

g++ example.cpp -o example -lcurl

8. 使用 libcurl 时的常见问题

  • 没有链接 libcurl:编译时如果忘记了 -lcurl 会导致链接错误。
  • SSL 问题:在处理 HTTPS 请求时,需要安装相应的 SSL 库,并确保 SSL 证书的正确性。
  • 响应回调未正确处理:确保 CURLOPT_WRITEFUNCTION 正确设置,且回调函数能正确处理数据。

结论

libcurl 是一个强大的库,能够简便地实现 HTTP GET 和 POST 请求。它的功能非常全面,支持重定向、SSL、cookie、文件上传、身份验证等复杂功能。


http://www.ppmy.cn/news/1531025.html

相关文章

MCUboot 和 U-Boot区别

MCUboot 和 U-Boot 都是用于嵌入式系统的引导加载程序&#xff0c;但它们在一些方面存在区别&#xff1a; 功能特性 安全特性侧重不同 MCUboot &#xff1a;更专注于安全引导方面&#xff0c;强调安全启动、固件完整性验证和加密等安全功能。它提供了强大的安全机制来防止恶意…

关于ollama 在mac的部署问题

安装 官网链接 直接按需求下载即可 默认模型下载地址 macOS: ~/.ollama/models Linux: /usr/share/ollama/.ollama/models Windows: C:\Users<username>.ollama\models 根据需要的平台设置相应的环境变量&#xff1a; OLLAMA_MODELS 如Mac 设置 &#xff5e;/.zshrc …

使用three.js+vue3完成无人机上下运动

效果图如上 代码&#xff1a; <template><div class"drones"><div ref"dronesContainer" class"drones-container"></div></div></template><script setup>import { ref, onMounted, onUnmounted, …

【开源免费】基于SpringBoot+Vue.JS教师工作量管理系统(JAVA毕业设计)

本文项目编号 T 043 &#xff0c;文末自助获取源码 \color{red}{T043&#xff0c;文末自助获取源码} T043&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

大数据平台符合信创(CDH国产化代替)详细方案(企业内部不外传方案)

目录 第一章 介绍信创 1.1 信创背景与要求 1.2 介绍符合信创要求的产品 第二章 CDH不符合信创要求的原因 2.1 国外厂商背景 2.2 技术自主性不足 2.3 安全和合规问题 第三章 国产整体方案代替方案 3.1 华为 FusionInsight 3.2 阿里云MaxCompute 3.3 星环科技TDH 第四…

Linux云计算 |【第四阶段】NOSQL-DAY1

主要内容&#xff1a; NoSQL概述&#xff08;RDBMS、NoSQL&#xff09;、部署Redis服务、Redis数据类型&#xff08;字符串、散列类型、列表类型、集合类型、有序集合类型&#xff09;、Redis其它操作命令、修改Redis服务运行参数、部署支持PHP和Redis的Nginx服务器 一、NoSQL…

tomcat 配置jenkins_home 目录

要在 Tomcat 中为 Jenkins 配置自定义的 JENKINS_HOME 目录&#xff08;用于存储 Jenkins 的工作目录和配置&#xff09;&#xff0c;你需要在 Tomcat 的环境变量中进行配置。下面是详细步骤&#xff1a; 1. 创建 Jenkins Home 目录 首先&#xff0c;选择一个你想要作为 JENK…

C语言中的一些小知识(三)

一、你了解printf()吗&#xff1f; 你知道下面代码的输出结果吗&#xff1f; int a123; printf("%2d \n",a); printf() 函数是 C 语言中用于格式化输出的标准函数&#xff0c;它允许你将数据以特定的格式输出到标准输出设备&#xff08;通常是屏幕&#xff09;。p…