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是常用的命令行工具, 它的名字就是客户端(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 是一个广泛使用的、支持多种协议的、开源的客户端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相关包下载
libcurl发行版本路径
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; }
参考文档
原文地址:https://blog.csdn.net/qq_28576837/article/details/145311744
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!