C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍

CURL 是一个功能强大的开源库,用于在各种平台上进行网络数据传输。它支持众多的网络协议,像 HTTP、HTTPS、FTP、SMTP 等,能让开发者方便地在程序里实现与远程服务器的通信。
CURL 可以在 Windows、Linux、macOS 等多种操作系统上使用;
CURL 支持多种网络协议,能处理复杂的网络请求,如设置请求头、处理 cookies、上传和下载文件等。
使用前,编译CURL 源码,生成动态库,引入时包括头文件一起,网上也有别人已经编译好的现成的库可以下载使用。
CURL的头文件
生成的库:
在这里插入图片描述
在你要使用的项目里加上curl的头文件

#include <curl\curl.h>

这下你就可以使用CURL里的接口完成功能了。

CURL常用的接口说明:

  • 初始化与清理相关的接口:
  1. curl_easy_init()
    功能:创建并初始化一个新的 CURL 句柄,用于后续的网络操作。这个句柄就像一个会话的载体,后续的请求设置和执行都围绕它展开。
    返回值:成功时返回一个指向新创建的 CURL 句柄的指针;失败则返回 NULL。
  2. curl_easy_cleanup(CURL *handle)
    功能:释放 CURL 句柄占用的所有资源,包括内存、网络连接等。在使用完 CURL 句柄后,必须调用此函数以避免资源泄漏。
    参数:handle 是之前通过 curl_easy_init() 得到的 CURL 句柄。
  • 请求选项设置相关的接口:
  1. curl_easy_setopt(CURL *handle, CURLoption option, …)
    功能:设置 CURL 句柄的各种选项,这些选项可以控制请求的各个方面,如请求的 URL、请求方法、请求头、回调函数等。
    参数:
    handle:CURL 句柄。
    option:CURLoption 类型的常量,指定要设置的选项。
    可变参数:根据不同的 option,需要传入相应的参数值。
    常用 option 有:
    CURLOPT_URL:设置请求的 URL。
    CURLOPT_POST:将请求方法设置为 POST。
    CURLOPT_HTTPHEADER:设置请求头。
    CURLOPT_POSTFIELDS:设置 POST 请求的数据。
  2. curl_slist_append(struct curl_slist *list, const char *string)
    功能:用于构建一个链表来存储请求头信息。每次调用该函数可以将一个新的请求头字符串添加到链表中。
    参数:
    list:指向 curl_slist 链表的指针,如果是第一次添加,可传入 NULL。
    string:要添加的请求头字符串,格式为 Header-Name: Header-Value。
    返回值:返回更新后的链表指针。
  • 回调函数设置相关的接口:
  1. CURLOPT_WRITEFUNCTION 和 CURLOPT_WRITEDATA
    功能:CURLOPT_WRITEFUNCTION:设置一个回调函数,当服务器返回响应数据时,CURL 会调用该回调函数来处理响应数据。
    CURLOPT_WRITEDATA:传递一个用户自定义的指针给回调函数,用于在回调函数中存储或处理数据。
  2. CURLOPT_READFUNCTION 和 CURLOPT_READDATA
    功能:CURLOPT_READFUNCTION:设置一个回调函数,用于在发送数据时从用户提供的数据源中读取数据。
    CURLOPT_READDATA:传递一个用户自定义的指针给回调函数,用于标识数据源。
  • 多线程与异步操作相关的接口:
  1. curl_multi_init()
    功能:初始化一个 CURLM 句柄,用于多线程或异步的网络操作。该句柄可以管理多个 CURL 句柄,实现并发请求。
    返回值:成功时返回一个新的 CURLM 句柄指针;失败返回 NULL。
  2. curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle)
    功能:将一个 CURL 句柄添加到 CURLM 句柄管理的句柄列表中,以便进行并发处理。
    参数:
    multi_handle:CURLM 句柄。
    easy_handle:要添加的 CURL 句柄。
  3. curl_multi_perform(CURLM *multi_handle, int *still_running)
    功能:在 CURLM 句柄管理的所有 CURL 句柄上执行网络操作。该函数会尝试处理尽可能多的请求,并返回仍在运行的请求数量。
    参数:
    multi_handle:CURLM 句柄。
    still_running:指向一个整数的指针,用于存储仍在运行的请求数量。
  4. curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle)
    功能:从 CURLM 句柄管理的句柄列表中移除一个 CURL 句柄。
    参数:
    multi_handle:CURLM 句柄。
    easy_handle:要移除的 CURL 句柄。
  5. curl_multi_cleanup(CURLM *multi_handle)
    功能:释放 CURLM 句柄占用的所有资源。在使用完 CURLM 句柄后,必须调用此函数进行清理。
    参数:multi_handle 是 CURLM 句柄。

接口流程使用:

简单的同步调用模式的使用流程:

  1. 调用curl_global_init()初始化libcurl ;
  2. 调用curl_easy_init()函数得到 easy;
  3. interface型指针 调用curl_easy_setopt()设置传输选项;
  4. 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务;
  5. 调用curl_easy_perform()函数完成传输任务,返回错误码 ;
  6. 调用curl_easy_cleanup()释放内存;
  7. 调用curl_global_cleanup() (可以不用调用);

在整过过程中设置curl_easy_setopt()参数是最关键的,了解相关参数及对应作用很重要。

举例说明CURL的调用实现

//http回调写函数
static size_t   CurlWriteBuffer(char *buffer, size_t size, size_t nmemb, std::string* stream)
{
   
    //第二个参数为每个数据的大小,第三个为数据个数,最后一个为接收变量
	size_t sizes = size*nmemb;
	if(stream == NULL) 
		return 0;
	stream->append(buffer,sizes);
	return sizes;
}

//http发送封装
int  HttpClient::posturl(std::string& msg,	std::string& url, bool IsSSL)
{
   
	CURL* pCurl=NULL;        //一个libcurl的handle
	CURLcode res;            //返回状态码
	std::string response;    //返回信息

    curl_global_init(CURL_GLOBAL_ALL);      //全局初始化
	pCurl = curl_easy_init();                //创建一个handle

	//设置请求头
	struct  curl_slist* pHeader = NULL;
	//传json格式,字符编码为utf8
	header_ = curl_slist_append(pHeader ,"Content-Type: application/json;charset=utf-8");

    //添加请求头到handle
	curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pHeader );

    //设置URL
	curl_easy_setopt(pCurl, CURLOPT_URL, url.c_str());  

	CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理
	curl_easy_setopt(pCurl,CURLOPT_POSTFIELDS,msg.c_str());            //post请求消息数据    
	curl_easy_setopt(pCurl,CURLOPT_POSTFIELDSIZE,msg.length());        //消息长度
	curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, CurlWriteBuffer);   //回调函数
	curl_easy_setopt(pCurl,CURLOPT_WRITEDATA,&response);               //数据接收变量
	curl_easy_setopt(pCurl,CURLOPT_TIMEOUT,m_settinginfo.m_http_timeout);  //连接超时时间

    //不支持ssl验证
	if(m_settinginfo.m_ssl == 0)
	{
   
		curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0);//设定为不验证证书和HOST
		curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0);
	}
	else
	{
   
		// 配置 https 请求所需证书
		if (m_settinginfo.m_ssl == 1)    //ssl单向验证,不验证服务器
		{
   
			curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L);		
		}else
		{
   //双向验证
			curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L);
			curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0);
			curl_easy_setopt(pCurl,CURLOPT_CAINFO,ca_info.ca_path.c_str()); 
		}

        //设置客户端信息
		curl_easy_setopt(pCurl, CURLOPT_SSLCERT, ca_info.client_cert_path.c_str());
		curl_easy_setopt(pCurl,CURLOPT_SSLCERTTYPE,"PEM");  
		curl_easy_setopt(pCurl, CURLOPT_SSLKEY, ca_info.client_key_path.c_str());
		curl_easy_setopt(pCurl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牵牛老人

码字不易,您的支持就是动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值