libcurl 简单使用

LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTPFTPSMTPPOP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等。它被广泛应用于各种网络应用开发中,特别是涉及到数据传输的场景。

官网:curl

下载安装:curl - Download

安装步骤

说明:在编译任何开源代码前可以先看看README, INSTALL等文件, 会提供如何编译的信息。在此教程中通过阅读README和GIT-INFO文 件可以得到很多编译安装信息。 在GIT-INFO 中很明显地说了执行: ./buildconf产生configure配置文件。

  1. ./buildconf(产生configure配置文件)
  2. ./configure --with-openssl (我是默认安装openssl的
  3. make
  4. make install(默认库文件安装在/usr/local/lib 头文件安装在/usr/local/include  --->安装要root权限)

libcurl库的API接口

(1)初始化curl句柄

CURL* curl = NULL;
curl = curl_easy_init();

(2)设置curl的url

curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:9001/login");

(3)开启post请求开关

curl_easy_setopt(curl, CURLOPT_POST, true);

(4)添加post数据

 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_str);

(5)设定一个处理服务器响应的回调函数

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, deal_response);

(6)给回调函数传递一个形参

curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);

(7)向服务器发送请求,等待服务器的响应

res = curl_easy_perform(curl);

测试用例(实现网页下载保存): 

// 采用CURLOPT_WRITEFUNCTION 实现网页下载保存功能
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#include <curl/curl.h>
#include <curl/easy.h>




FILE *fp;  //定义FILE类型指针


//这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的,完成数据保存功能
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)  
{
    int written = fwrite(ptr, size, nmemb, (FILE *)fp);
    return written;
}




 
int main(int argc, char *argv[])
{
    CURL *curl;
    if (argc != 3)
    {
		fprintf(stderr, "usage: %s url filename\n", argv[0]);
		exit(-1);
    }
    curl_global_init(CURL_GLOBAL_ALL);  
    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, argv[1]);  
 
    if((fp = fopen(argv[2],"w")) == NULL)
    {
        curl_easy_cleanup(curl);
        exit(1);
    }
  //CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);  
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    exit(0);
}

编译运行: 


该库的使用很简单,首先我们需要调用curl_easy_init()函数对CURL对象进行初始化,接着通过调用curl_easy_setopt()并传入一个访问URL链接,当访问成功后则可curl_easy_perform()函数得到访问结果。

<1>调curl_global_init()接口进行全局初始化

        一个进程只需调用一次。如果一次都未调用,curl_easy_init()接口内部会自动调curl_global_init(),因为curl_easy_init()并不是多线程安全,如果两个线程同时调用curl_easy_init(),会概率出现一个线程在没有全局初始化下就进行网络传输导致崩溃,于是强烈建议显示调用curl_global_init()进行libcurl库进行全局初始化。

<2>调curl_easy_init()接口分配一个网络传输对象

因为libcurl是以C语言接口形式提供,所以后续调用的接口都需要提供该接口返回的句柄。

<3>调curl_easy_init()接口分配一个网络传输对象

   因为libcurl是以C语言接口形式提供,所以后续调用的接口都需要提供该接口返回的句柄。

curl_easy_setopt()函数第二个参数可以使用多种类型的变量定义,我们可以通过传入不同的常量来定义请求头中的参数,

CURLOPT_VERBOSE设置值为1启用调试输出,此时要设置CURLOPT_DEBUGFUNCTION 调试输出函数,排查问题时使用。
CURLOPT_URL设置URL地址
CURLOPT_PUT设置HTTP请求方法为PUT,CURLOPT_POST设置HTTP请求方法为POST,要设置HTTP请求方法为DELETE或PATCH,就得用CURLOPT_CUSTOMREQUEST
CURLOPT_POSTFIELDS设置HTTP请求body内容,CURLOPT_POSTFIELDSIZE设置body大小,如果body内容是以\0结尾,可以不指定body大小。
 
CURLOPT_HTTPHEADER设置HTTP头部,HTTP头部是用curl_slist结构的链表,curl_slist_append()添加HTTP头部,可以调多次添加多个头部,curl_slist_free_all()释放curl_slis对象。
 
CURLOPT_WRITEFUNCTION设置HTTP请求body的数据输出函数,同时可以指定CURLOPT_WRITEDATA作为输出函数的user_data,libcurl会透传user_data。
CURLOPT_TIMEOUT_MS设置网络请求总超时值,CURLOPT_CONNECTTIMEOUT_MS设置网络socket连接超时值。
 
CURLOPT_SSL_VERIFYPEER设置0时不校验服务端,HTTPS请求时如果本地没有服务端证书,需要设置为0。

官方api文档

libcurl - curl_easy_setopt()

<4>调curl_easy_getinfo()接口获取网络请求响应信息

        它类似于curl_easy_setopt()接口,第2个参数指定获取项,第3个参数依第2个参数不同而不同,比较常用的是CURLINFO_RESPONSE_CODE,获取状态码。

<5>调curl_easy_cleanup()接口释放资源

<6>调curl_global_cleanup()接口释放全局资源

下面的demo代码介绍如何使用libcurl库进行HTTP GET和POST请求

#include <stdio.h>
#include <curl/curl.h>
#include <string>


size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
    ((std::string*)userdata)->append(ptr, nmemb);
    return nmemb;
}




int main(void)
{
    curl_global_init(CURL_GLOBAL_DEFAULT);
    CURL* curl = curl_easy_init();
    if (curl) 
    {        
        curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");

        // no certificate, not verify server certificate
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

        std::string response_data;
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_data);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));
        }
        else
        {
            long response_code;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
            printf("response code %ld \n", response_code);
            printf("response data : \n ");
            printf(response_data.c_str());
        }

        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();
    return 0;
}

运行结果: 

#include <stdio.h>
#include <curl/curl.h>
#include <string>

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
    ((std::string*)userdata)->append(ptr, nmemb);
    return nmemb;
}

int main()
{
    curl_global_init(CURL_GLOBAL_DEFAULT);
    CURL* curl = curl_easy_init();
    if (curl)
    {
        // set url
        curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");

        // no certificate, not verify server certificate
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

        // set http method
        curl_easy_setopt(curl, CURLOPT_POST, 1);

        // set header
        struct curl_slist * slist = nullptr;
        slist = curl_slist_append(slist, "Content-Type : application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);

        // set body
        std::string body = "{\
            \"title\":\"libcurl post title\",\
            \"body\" : \"libcurl post body\",\
            \"userId\" : 1}";
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());

        // set response callback to read response
        std::string response_data;        
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_data);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));
        }
        else
        {
            // get response code
            long response_code;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
            printf("response code %ld \n", response_code);
            printf("response data : \n ");
            printf("%s", response_data.c_str());
        }

        curl_slist_free_all(slist);
        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();
    return 0;
}

运行结果: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/549019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BackTrader 中文文档(十八)

原文&#xff1a;www.backtrader.com/ OCO 订单 原文&#xff1a;www.backtrader.com/blog/posts/2017-03-19-oco/oco/ 版本 1.9.34.116 添加了OCO&#xff08;又称一次取消其他&#xff09;到回测工具中。 注意 这只在回测中实现&#xff0c;尚未实现对实时经纪商的实现 注…

PHP直播电商平台APP开发应该具有的功能和搭建之前应该思考的过程?

直播电商平台是一个充满活力和潜力的领域&#xff0c;可以为用户提供全新的购物体验。以下是一些开发和搭建直播电商平台的想法&#xff1a; 功能丰富的直播模块&#xff1a; 实现主播与观众之间的实时互动&#xff0c;包括文字聊天、语音聊天、送礼物、打赏等功能。 商品展示…

SpringBoot + minio实现分片上传、秒传、续传

什么是minio MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议&#xff0c;项目地址是https://github.com/minio/minio。 引用官网&#xff1a; MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容…

Window安装Redis

安装Redis-Service 下载并安装最新版Redis-windows &#xff1a; https://github.com/redis-windows/redis-windows 安装Redis-Manager Another Redis Desktop Manager 是一款优秀Redis桌面(GUI)管理客户端 参考链接 https://redis.io/

如何解决3dmax渲染大图时出现的噪点问题?

3dmax效果图云渲染平台——渲染100以3ds Max 2024、VR 6.2、CR 11.2等最新版本为基础&#xff0c;兼容fp、acescg等常用插件&#xff0c;同时LUT滤镜等参数也得到了同步支持。注册填邀请码【7788】可领30元礼包和免费渲染券哦~ 在3ds Max中渲染大尺寸图像时&#xff0c;噪点问题…

【数据结构】树与二叉树、树与森林部分习题以及算法设计例题 2

目录 【数据结构】树与二叉树、树与森林部分习题以及算法设计例题一、交换二叉树每个结点的左右孩子Swap 函数&#xff08;先序遍历&#xff09;&#xff1a;Swap 函数&#xff08;中序遍历&#xff09; 不可行&#xff1a;Swap 函数&#xff08;后序遍历&#xff09;&#xff…

打造属于你的体育直播平台:使用东莞梦幻网络源码缺点和优点

随着互联网的快速发展&#xff0c;体育直播平台已经成为了人们获取体育赛事信息和互动交流的重要渠道。为了快速搭建这样一个平台&#xff0c;许多企业和个人选择使用现成的源码&#xff0c;其中东莞梦幻网络科技提供的体育直播源码备受关注。然而&#xff0c;在选择使用该源码…

授权协议OAuth 2.0之JWT

写在前面 本文看下JWT相关内容。 1&#xff1a;为什么需要JWT OAuth2.0规范中并没有规定access_token使用什么样的格式&#xff0c;只要求满足&#xff0c;不连续性&#xff0c;不可猜测性&#xff0c;不可重复性就可以了&#xff0c;所以我们在生成accest_token的时候就比较…

解决:IDEA编译报错,自动切换JDK编译版本

一、IDEA切换JDK版本 要想在IDEA中完成对JDK版本的切换有多个地方需要我们进行修改 File | Settings | Build, Execution, Deployment | Compiler | Java Compiler File->ProjectStruct->platform settings->SDKS File->ProjectStruct->projectSettings->…

算法|基础算法|高精度算法

基础算法|位运算 1.高精度加法 2.高精度减法 3.高精度乘法 4.高精度除法 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 高精度加法 …

GPT-4 都已经这么强了,那未来的 GPT-5 会是什么样子?

GPT-4 可以说是再一次颠覆了我对 AI 的认知&#xff0c;从文本到图片视频&#xff0c;再到逻辑推理&#xff0c;简直是神进步。 GPT5上线前夕&#xff0c;把GPT4慢慢弄成GPT3.5的效果&#xff0c;把GPT3.5逐渐弄成GPT3的效果&#xff0c;GPT5横空出世的时候就如GPT4对GPT3.5的…

麦多馅饼创始人是谁,麦多馅饼品牌历程?

麦多馅饼的创始人是刘占华先生&#xff0c;他于2006年创建了吉林通化麦多食品有限公司。刘先生有着超过20年的餐饮连锁管理经验&#xff0c;是麦多馅饼品类的原创者。他的故事充满了奋斗和创业的精神&#xff0c;是中国餐饮行业的一段佳话。 品牌历程充满了刘占华先生的智慧和…

天工杂志社《天工》杂志社2024年第5期目录

业界翘楚 巍巍者昆仑 煌煌者华夏 乔彦鹏; 6-8 工美史话 日月之光照澈幽冥——墓葬铜镜中柿蒂纹意象辨析 周昕怡;刘春芽; 9-11 西藏传统手工艺技能教育发展历程研究 吕元菊; 12-14 探索研究《天工》投稿&#xff1a;cn7kantougao163.com 传统装饰艺术设计美学的…

如何拿捏2024年的B端设计?(附工具推荐)

伴随着2019年前的互联网人口红利时代结束&#xff0c;科技行业的基本面发生了巨大的变化&#xff0c;以普通消费者为目标的C端需求大幅萎缩&#xff0c;面向企业的B端需求成为行业热点。 在2024年的今天&#xff0c;设计师应该如何理解B端设计的实质&#xff0c;并真正驾驭B端产…

循环购模式:消费返利与积分新体验

大家好&#xff0c;我是吴军&#xff0c;今天我想和大家深入探讨一种别具一格且令人瞩目的商业模式——循环购模式。这一模式巧妙地将消费返利与积分机制相融合&#xff0c;为商家和消费者之间搭建了一座崭新的互动桥梁。 在循环购模式的运作下&#xff0c;消费者的每一次购买行…

基于springboot+vue+Mysql的地方废物回收机构管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

如何下载省,市,区县行政区Shp数据

摘要&#xff1a;一般非专业的GIS应用通常会用到省市等行政区区划边界空间数据做分析&#xff0c;本文简单介绍了如何在互联网上下载省&#xff0c;市&#xff0c;区县的shp格式空间边界数据&#xff0c;并介绍了一个好用的在线数据转换工具&#xff0c;并且开源。 目录 一、下…

AI智能分析网关V4平台告警数据清理方法:自动清理与手动清理

TSINGSEE青犀智能分析网关V4属于高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;目前拥有3种型号&#xff08;8路/16路/32路&#xff09;&#xff0c;支持Caffe/DarkNet/TensorFlow/PyTorch/MXNet/ONNX/PaddlePaddle等主流深度学习框架。硬件内部署了近40种AI算法模型…

手机抓包fiddler配置及使用教程

本文基于Fiddler4讲解基本使用 fiddler抓包原理 注意&#xff1a;Fiddler 是以代理web服务器的形式工作的&#xff0c;它使用代理地址:127.0.0.1&#xff0c;端口:8888。当Fiddler退出的时候它会自动注销&#xff0c;这样就不会影响别的 程序。不过如果Fiddler非正常退出&…

浅谈Java NIO

Java NIO&#xff08;New Input/Output&#xff09;是Java平台上一种全新的IO API&#xff0c;相较于传统的Java I/O&#xff08;也称为BIO&#xff0c;阻塞I/O&#xff09;&#xff0c;NIO引入了非阻塞I/O和通道&#xff08;Channel&#xff09;的概念&#xff0c;以及缓冲区&…