curl简介与libcurl开源库的使用总结

curl工具和libcurl不是同一个东西,二者的关系主要体现在以下方面:

定义与性质

curl工具:

是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持多种协议,如HTTP、HTTPS、FTP、FTPS等,可用于文件上传、下载以及处理cookies、跟踪重定向、执行身份验证等操作。

libcurl库:

是一个广泛使用的、支持多种协议的、开源的客户端URL传输库。它提供了许多用于数据传输的API,例如文件传输、FTP、HTTP、HTTPS、SMTP等,方便开发者在不同的场景下使用。

功能与用途

curl工具:

主要用于在命令行中直接执行各种网络请求和数据传输任务。用户可以通过输入特定的命令和参数,快速地实现与服务器的交互,如发送HTTP请求获取网页内容、上传文件到FTP服务器等。它适用于简单的网络操作和临时性的数据传输需求,常用于测试网络连接、调试API接口等。

libcurl库:

主要应用于程序开发中,为开发者提供了一个强大的网络通信接口。通过调用libcurl提供的函数和API,开发者可以在自己的应用程序中实现复杂的网络功能,如构建自定义的网络客户端、实现自动化的文件下载和上传、进行多线程或异步的网络请求等。它可以与各种编程语言结合使用,如C、C++、Python、PHP等,为不同语言的开发者提供了便利。

使用方式

curl工具:

通过在命令行中输入相应的命令和参数来使用,无需编写代码。例如,使用curl -O http://example.com/file.zip命令可以下载指定URL的文件;使用curl -u username:password -T file.zip ftp://ftp.example.com/命令可以通过FTP上传文件。

libcurl库:

需要在编程环境中使用相应的编程语言调用其API函数。以C语言为例,需要包含libcurl的头文件,然后初始化libcurl库、设置相关选项、执行请求并处理响应结果等。

综上所述,curl工具和libcurl虽然都与网络数据传输相关,但它们在定义、功能和使用方式上存在明显的区别。curl工具是直接在命令行中使用的工具,而libcurl库则是供开发者在程序中调用的库函数集合,两者相辅相成,共同为用户提供了强大的网络功能支持。

curl工具通常就是一个基于libcurl的可执行文件,但是libcurl是源码。

cURL简介

主要参考:

curl工具的入门级使用-CSDN博客

cURL是常用的命令行工具, 它的名字就是客户端(client)的 URL 工具的意思。1997年首次发行。

cURL是一个利用URL语法在命令行方式下工作的开源文件传输工具,也是一个跨平台的库(libcurl), cURL编程用于需要通过Internet协议发送或接收数据的几乎任何地方。它支持几乎所有的互联网协议(DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,MQTT,POP3,POP3S,RTMP,RTMPS,RTSP,SCP,SFTP,SMB,SMBS,SMTP ,SMTPS,TELNET和TFTP)。此外,cURL还支持各种选项和参数,如代理支持、文件断点续传、带宽限制、SSL连接等。这些功能使得cURL成为一个灵活和强大的工具,广泛应用于网络开发和系统管理中。

在Windows下安装使用cURL

下载cURL安装包:可以从cURL官网(curl - Download) 下载Windows版本的cURL安装包。根据个人电脑系统位数(32位或64位)选择相应的安装包进行下载。在个人电脑中,curl已经是内置工具了,无需下载安装。在任意位置打开CMD,输入命令curl --help回车,如果出现curl help信息,说明Curl能够运行,比如:

关于在Windows下安装使用cURL,我们就了解这么多,重点关注Linux下的使用。

ubuntu安装和使用curl工具

在Ubuntu上安装curl工具是一个简单的过程。curl是一个非常有用的命令行工具,用于传输数据,支持多种协议,包括HTTP、HTTPS、FTP等。以下是如何在Ubuntu上安装curl的步骤:

sudo apt update
sudo apt install curl

系统可能会要求你确认安装。当提示时,输入Y然后按Enter键继续。

安装完成后,你可以通过运行以下命令来验证curl是否成功安装:

curl --version

如果curl已成功安装,该命令将显示curl的版本信息。

这就是在Ubuntu上安装curl的全部步骤。现在,你可以开始使用curl来下载文件、测试网站的响应或进行其他网络请求了。

curl命令的简单使用

linux下使用curl来访问百度

在 Linux 下使用 curl 访问百度非常简单。curl 是一个强大的命令行工具,用于与各种协议进行数据传输,包括 HTTP、HTTPS、FTP 等。以下是如何使用 curl 来访问百度的步骤:

在终端中,输入以下命令来使用 curl 访问百度的首页:

curl https://www.baidu.com

这个命令告诉 curl 使用 HTTPS 协议去请求百度的服务器,并获取其首页的 HTML 内容。

按下回车键后,curl 会开始执行请求。如果一切正常,你将在终端中看到百度首页的 HTML 源代码。这些代码是由百度服务器返回的,显示了百度首页的内容。

如果你想要将输出保存到文件中,可以使用重定向操作符 >。例如,将百度首页的 HTML 内容保存到名为 baidu.html 的文件中:

curl https://www.baidu.com > baidu.html

这样,百度首页的 HTML 内容就会被保存到你当前目录下的 baidu.html 文件中,你可以使用任何文本编辑器打开它进行查看。

如果遇到网络问题或服务器无法访问的情况,curl 会显示错误信息。确保你的网络连接正常,并且目标 URL 是正确的。

其余选项的使用可以使用curl --help或man curl查看帮助信息,每个选项都有详细的说明。

curl命令能为之后curl库的使用提供参考基础,建议在进行curl代码编写前先使用curl命令实现,有些时候的bug不是代码造成的,有可能本身curl就无法建立连接。

libcurl开源库的编译与使用

主要参考:

libcurl开源库的编译与使用全攻略_libcurl编译-CSDN博客

libcurl简介

libcurl 是一个广泛使用的、支持多种协议的、开源的客户端URL传输库,提供了许多用于数据传输的API,例如文件传输、FTP、HTTP、HTTPS、SMTP等。

libcurl 的主要特点包括

支持多种协议:libcurl 支持多种协议,如 HTTP、FTP、SMTP 等,方便开发者在不同的场景下使用。

易于使用:libcurl 的 API 设计简洁,易于使用,方便开发者快速开发出网络通信功能。

可移植性强:libcurl 支持多种操作系统,如 Linux、Windows、MacOS 等,方便开发者在不同的平台上使用。

可定制性强:libcurl 支持插件机制,开发者可以根据自己的需求定制不同的插件,实现不同的功能。

高效稳定:libcurl 在数据传输过程中采用了多种优化技术,保证了数据传输的高效性和稳定性。

总的来说,libcurl 是一个功能强大、易于使用、可移植性强、可定制性强、高效稳定的网络通信库,被广泛应用于各种软件开发中。

本文章主要介绍libcurl在linux平台下的编译步骤,并介绍了libcurl相关的API接口,最后通过一个demo演示如何通过libcurl发送http请求。

libcurl主要使用C语言编写。

从其官方文档来看,在介绍如何使用libcurl时,使用的示例代码均为C语言。并且,libcurl的开发者在开发过程中也是以C语言为基础进行编写和实现的,以确保其在各种操作系统和环境下的高效运行和稳定性。

官方文档

libcurl - API

libcurl相关包下载

libcurl发行版本路径

Releases · curl/curl · GitHub

linux平台下载tar.gz包。以7.85.0版本为例,下载curl-7.85.0.tar.gz 包。

openssl发行版本 :使用libcurl一般都需要依赖openssl库

Releases · openssl/openssl · GitHub

openssl发行版本只有tar.gz包,windows/linux平台都使用这个包即可。以1.1.1u版本为例,下载 openssl-1.1.1u.tar.gz 包

linux平台libcurl库编译

由于需要依赖openssl,先编译openssl库

openssl编译

解压openssl压缩包后进入解压后的目录

分别执行以下命令

./config --prefix=${PWD}/_install
sudo make
sudo make install

编译安装完成后,openssl相关库和头文件都会释放到 _install 目录下

libcurl编译

解压libcurl压缩包后进入解压后的目录

分别执行以下命令

./configure --prefix=${PWD}/_install --with-openssl=${PWD}/../openssl-1.1.1u/_install
sudo make
sudo make install

–prefix 指定的是安装目录,如果不指定会默认安装到系统目录下。–with-openssl 指定的是openssl相关库目录。

编译安装完成后,相关库和头文件会释放到_install目录下

相关接口

CURLcode curl_global_init(long flags)

描述:初始化libcurl,只能调用一次,且在其他函数之前调用
参数
flags
CURL_GLOBAL_ALL : 初始化所有的可能的调用。
CURL_GLOBAL_SSL : 初始化支持 安全套接字层。
CURL_GLOBAL_WIN32 : 初始化win32套接字库。
CURL_GLOBAL_NOTHING : 没有额外的初始化
返回值 : 返回 CURLE_OK 为成功,返回其他值失败
CURL *curl_easy_init(void)

描述:初始化一个CURL类型的指针,要在 curl_easy_cleanup 中进行释放。
返回值: 返回一个 CURL 类型指针,在 curl_easy_setopt 函数中使用
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, …);

描述:设置选项
参数
curl : curl_easy_init 返回的 CURL类型指针
option :curl_easy_setopt函数option参数介绍
返回值 : 返回 CURLE_OK 为成功,返回其他值失败
CURLcode curl_easy_perform(CURL *curl)

描述:以阻塞方式执行请求
参数:
curl :curl_easy_init 返回的 CURL类型指针
返回值:返回 CURLE_OK 为成功,返回其他值失败
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, …)

描述:请求curl 会话中的相关信息
参数
curl :curl_easy_init 返回的 CURL类型指针
info
CURLINFO_RESPONSE_CODE :获取http状态码
其他参数描述
返回值:返回 CURLE_OK 为成功,返回其他值失败
void curl_easy_reset(CURL *curl)

描述:重新初始化CURL指针为默认值
void curl_easy_cleanup(CURL *curl)

描述:清理 curl_easy_init 接口申请的 CURL 类型指针
curl_easy_setopt函数option参数介绍

CURLOPT_URL :设置要访问的URl
CURLOPT_WRITEFUNCTION :设置回调函数,回调函数在libcurl接收到数据后被调用
回调函数原型:size_t function(void *ptr, size_t size, size_t nmemb, void *stream);
CURLOPT_WRITEDATA :用于表明 CURLOPT_WRITEFUNCTION 函数中的stream指针的来源
CURLOPT_HEADERFUNCTION :设置回调函数,回调函数在libcurl接收到http响应头后被调用
回调函数原型 : size_t function( void *ptr, size_t size,size_t nmemb, void *stream);
CURLOPT_HEADERDATA : 表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。
CURLOPT_TIMEOUT :设置数据传输超时时间
CURLOPT_CONNECTIONTIMEOUT :设置连接超时时间
CURLOPT_POST :设置请求方式为post
CURLOPT_POSTFIELDS : 设置post请求体
CURLOPT_POSTFIELDSIZE :设置post请求大小
CURLOPT_HTTPHEADER : 设置http请求头
CURLOPT_SSL_VERIFYPEER :设置是否验证对端证书,设置为0表示不验证。默认为1,表示验证。
CURLOPT_SSL_VERIFYHOST :设置是都验证服务器证书,设置为0表示不验证。
其他参数

演示代码

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <curl/curl.h>
  #include <iostream>
  
  typedef struct {
      std::string body;
  	size_t bodySize;
  } stResponse;
  
  typedef struct {
      std::string header;
  	size_t headerSize;
  } stResponseHeader;
  
  size_t responseBodyCallback(void *ptr, size_t size, size_t nmemb, void *stream) {
      stResponse* pResponse = (stResponse*)stream;
  	pResponse->body.append((char*)ptr, size * nmemb);
  	pResponse->bodySize = size * nmemb;
  	return size * nmemb;
  }
  
  size_t responseHeaderCallback(void *ptr, size_t size, size_t nmemb, void *stream){
  	stResponseHeader* pResponseHeader = (stResponseHeader*)stream;
  	pResponseHeader->header.append((char*)ptr, size * nmemb);
  	pResponseHeader->headerSize = size * nmemb;
  	return size * nmemb;
  }
  
  int main(){
  	std::string readBuffer;
  	stResponse response;
  	stResponseHeader responseHeader;
  
  	// 初始化所有可能的调用
  	curl_global_init(CURL_GLOBAL_ALL);
  
  	
  	CURL *curl = curl_easy_init();
  
  	// 设置url
  	curl_easy_setopt(curl, CURLOPT_URL, "http://182.92.205.179:10088");
  
  	// 设置post请求,不设置或设置为0则为get请求
  	curl_easy_setopt(curl, CURLOPT_POST, 1);
  	// 设置post请求体
  	char postData[1024] = "{\"req\":\"hello\"}";
  	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);
  	// 设置post请求体大小
  	curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(postData));
  
  	// 设置http请求头
  	curl_slist* headerList = NULL;
  	headerList = curl_slist_append(headerList, "Content-Type: application/json");
  	headerList = curl_slist_append(headerList, "flag: libcurl");
  	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerList);
  
  	// 设置不校验证书,https请求时使用
  	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
  
  	// 设置回调函数获取响应体数据
  	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, responseBodyCallback);
  	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response);
  
  	// 设置回调函数获取响应头数据
  	curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, responseHeaderCallback);
  	curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&responseHeader);
  
  	// 超时时间
  	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5);
  
  	// 执行请求
  	CURLcode res = curl_easy_perform(curl);
  
  	// 检查错误
  	if(res == CURLE_OK){
  		// 获取状态码
  		int responseCode = 0;
  		curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode);
  		std::cout << "code : "<<responseCode << std::endl;
  
  		std::cout << "responseHeader size : "<<responseHeader.headerSize << std::endl;
  		std::cout << "responseHeader header : "<<responseHeader.header.c_str() << std::endl;
  
  		std::cout << "response size : "<<response.bodySize << std::endl;
  		std::cout << "response body : "<<response.body.c_str() << std::endl;
  	}else{
  		std::cout<<curl_easy_strerror(res)<<std::endl;
  	}
  
  	curl_slist_free_all(headerList);
  
  	// 清理
  	curl_easy_cleanup(curl);
  
  
  	return 0;
  }

参考文档

  • 官方API文档

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

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

相关文章

node.js 07.npm下包慢的问题与nrm的使用

一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…

Flutter:carousel_slider 横向轮播图、垂直轮播公告栏实现

安装依赖 carousel_slider: ^5.0.01、垂直滚动公告栏 import package:carousel_slider/carousel_options.dart;// 垂直滚动公告栏Widget _buildNotice() {return <Widget>[<Widget>[TDImage(assetUrl: "assets/img/home11.png",width: 60.w,height: 60.w…

RavenMarket:用AI和区块链重塑预测市场

不论是美股市场还是加密市场&#xff0c;AI都是本轮周期里的最大叙事。本轮AI的最大受益者英伟达市值超越苹果一跃成为全球第一大公司&#xff0c;加密领域围绕着AI的创新也是层出不穷&#xff0c;很多项目方开始向着AI转型。 而近期币圈最热门的板块就是AI agent&#xff0c;…

【玩转全栈】----Django基本配置和介绍

目录 Django基本介绍&#xff1a; Django基本配置&#xff1a; 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍&#xff1a; Django是一个开源的、基于Python的高级Web框架&#xff0c;旨在以快速、简洁的方式构建高质量的Web…

学技术学英语:TCP的三次握手和四次挥手

单词 汉语意思 音标 acknowledge 承认&#xff0c;确认 /əkˈnɒl.ɪdʒ/ acknowledgment 确认&#xff0c;承认 /əkˈnɒl.ɪdʒ.mənt/ duplex 双向的 /ˈdjuː.pleks/ establish 建立 /ɪˈstb.lɪʃ/ handshake 握手&#xff0c;握手协议 /ˈhnd.ʃeɪk…

iconfont等图标托管网站上传svg显示未轮廓化解决办法

打开即时设计 即时设计 - 可实时协作的专业 UI 设计工具 导入图标后拖入画板里面&#xff0c;右键选择轮廓化 将图标导出

SpringBoot集成Flink-CDC,实现对数据库数据的监听

一、什么是 CDC &#xff1f; CDC 是Change Data Capture&#xff08;变更数据获取&#xff09;的简称。 核心思想是&#xff0c;监测并捕获数据库的变动&#xff08;包括数据或数据表的插入、 更新以及删除等&#xff09;&#xff0c;将这些变更按发生的顺序完整记录下来&…

豆包 MarsCode + 开源 = ?AI 助力开源社区新人成长

来源&#xff5c;豆包 MarsCode “开源” 这个词&#xff0c;对开发者来说&#xff0c;可能是入门时的第一步&#xff0c;也可能是追求极致技术的终点。无数优秀的开源项目不仅推动了技术的进步&#xff0c;也成为开发者学习和成长的宝藏&#xff0c;但同时也因为其规模庞大、代…

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…

机器学习-线性回归(简单回归、多元回归)

这一篇文章&#xff0c;我们主要来理解一下&#xff0c;什么是线性回归中的简单回归和多元回归&#xff0c;顺便掌握一下特征向量的概念。 一、简单回归 简单回归是线性回归的一种最基本形式&#xff0c;它用于研究**一个自变量&#xff08;输入&#xff09;与一个因变量&…

Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽

大家读完记得觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 此分享内容比较专业&#xff0c;很多与硬件和通讯规则及队列&#xff0c;比较底层需要有技术功底人员深入解读。 Linux 的带宽管理能力 足以媲美许多高端、专用的带宽管理系统。 1 队列&#xff0…

安装k8s前置操作(Ubuntu / CentOS)

本文将介绍在 Ubuntu 和 CentOS 系统上进行 Kubernetes 部署前的基本配置步骤。不同的操作系统有不同的配置方法&#xff0c;但大部分操作是相似的。本文章将分为两个部分&#xff1a;第一部分是 Ubuntu 前置操作&#xff0c;第二部分是 CentOS 前置操作。 第一节&#xff1a;U…

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

C语言教程——动态内存管理(2)

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 我们之前学了动态内存管理分配函数&#xff0c;也是熟悉了动态内存分配函数&#xff0c;基于动态内存分配我把之前的通讯录做了修改&#xff0c;上传到了gitee上&#xff0c;这篇文章接着…

python学习笔记3-字符串常用的方法

一、判断&#xff08;9个&#xff09;&#xff1a; 二、查找和替换&#xff08;8个&#xff09; 三、⼤⼩写转换&#xff08;5个&#xff09; 四、⽂本对⻬&#xff08;3个&#xff09; 五、去除空⽩字符&#xff08;3个&#xff09; 六、拆分和连接 &#xff08;6个&#xff0…

MySQL主从配置

一、 主从原理 MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作。 二、主…

【java数据结构】二叉搜索树

【java数据结构】二叉搜索树 一、二叉搜索树的概念二、二叉搜索树的操作2.1 插入2.2 查找2.3 删除&#xff08;重点以及难点&#xff09;2.3.1 删除节点的左边为null2.3.2 删除节点的右边为null2.3.3 删除的左右节点都不为空 三、二叉搜索树的性能分析3.1 最优情况3.2 最差情况…

【Maui】注销用户,采用“手势”点击label弹窗选择

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;3.1 方法一&#xff1a;前端绑定3.2 方法二&#xff1a;后端绑定3.3 注销用户的方法 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创…

【JVM】垃圾收集器详解

你将学到 1. Serial 收集器 2. ParNew 收集器 3. Parallel Scavenge 收集器 4. Serial Old 收集器 5. Parallel Old 收集器 6. CMS 收集器 7. G1 收集器 在 Java 中&#xff0c;垃圾回收&#xff08;GC&#xff09;是自动管理内存的一个重要机制。HotSpot JVM 提供了多种…

代码随想录算法训练营day35

代码随想录算法训练营 —day35 文章目录 代码随想录算法训练营前言一、01背包问题 二维二、 01背包问题 一维 &#xff08;滚动数组&#xff09;三、416. 分割等和子集总结 前言 今天是算法营的第35天&#xff0c;希望自己能够坚持下来&#xff01; 今天开始是背包问题了&…