目录
前言
Curl是一个命令行工具和库,用于用url传输数据;支持HTTP、HTTPS、FTP、LDAP、DICT、TELNET、SFTP、SCP等多种传输协议,curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传等等。
curl可以分为命令行工具 和 libcurl库两部分,curl工具可以很好地帮助开发诊断、在终端设备中集成命令行实现数据传输功能;libcurl库是一个客户端URL传输库,提供了很多接口函数,可以用于相关开发。
一、libcurl库
curl官网:https://curl.haxx.se/
curl开源代码: git clone https://github.com/curl/curl.git
通过makefile文件,编译完成后生成libcurl.so动态库文件,可以在编译过程中链接使用。
二、libcurl使用
1.libcurl接口函数介绍
getparameter()接口用于解析传入的curl命令参数,支持用户自定义参数处理:
ParameterError getparameter(const char *flag, char *nextarg, bool *usedarg, struct GlobalConfig *global, struct OperationConfig *config)
const char *flag:指向一个字符串,表示当前正在解析的参数标志(例如 --user-agent 或 --timeout)。
char *nextarg:指向可能包含参数值的字符串。例如,如果 flag 是 --user-agent,nextarg 可能是用户代理的字符串。
bool *usedarg:指向一个布尔值,指示 nextarg 是否被使用。如果参数不需要额外的值(如开关标志),则 *usedarg 应设置为 false。
struct GlobalConfig *global:指向全局配置结构体的指针
struct OperationConfig *config:指向操作配置结构体的指针,参数解析结果存入结构体
Curl_init_userdefined()接口初始化了Curl_easy的用户定义,例如C库读写处理函数fwrite() fread():
CURLcode Curl_init_userdefined(struct Curl_easy *data)
/* use fwrite as default function to store output */
set->fwrite_func = (curl_write_callback)fwrite;
/* use fread as default function to read input */
set->fread_func_set = (curl_read_callback)fread;
通过curl_easy创建CURL句柄,进行网络数据传输相关接口:
//curl指针初始化
CURL *curl_easy_init(void);
//为 CURL 句柄设置各种选项
CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...)
选项设置官方详细说明:
http://curl.se/libcurl/c/curl_easy_setopt.html
常用选项:
CURLOPT_CUSTOMREQUEST curl请求方法,例如"GET"
CURLOPT_URL curl请求URL
CURLOPT_TIMEOUT_MS curl请求超时退出
CURLOPT_WRITEFUNCTION 请求数据写回调处理
CURLOPT_WRITEDATA 数据通过CURLOPT_WRITEFUNCTION回调写入默认定义的文件指针中
CURLOPT_READFUNCTION 读回调处理
CURLOPT_READDATA 通过CURLOPT_READFUNCTION回调读入默认定义的文件指针中
CURLOPT_SSLVERSION SSL版本
CURLOPT_SSL_CIPHER_LIST 加密套件列表
CURLOPT_SSL_VERIFYPEER 是否验证SSL证书为CA机构签发--自签名证书配置为0
CURLOPT_SSL_VERIFYHOST SSL 证书中的主机名是否与请求的主机名匹配
CURLOPT_SSL_CTX_FUNCTION 设置自定义的证书、私钥等相关信息的回调函数
CURLOPT_CAINFO 配置证书文件-全路径
CURLOPT_CAPATH 配置证书路径-路径下存放单个证书文件/哈希证书文件
CURLOPT_CONNECTTIMEOUT 连接失败超时退出
CURLOPT_NOSIGNAL 不触发signal信号控制的连接超时
//执行curl请求
CURLcode curl_easy_perform(struct Curl_easy *data)
//转换curlcode为可读错误描述字符串
CURL_EXTERN const char *curl_easy_strerror(CURLcode)
//执行 curl_easy_perform() 完成网络请求之后,调用 curl_easy_getinfo() 来获取请求的相关信息
CURLcode curl_easy_getinfo(struct Curl_easy *data, CURLINFO info, ...)
获取选项说明:
https://curl.se/libcurl/c/curl_easy_getinfo.html
CURLINFO_RESPONSE_CODE HTTP响应code
CURLINFO_SIZE_DOWNLOAD 上一次传输的下载总量
CURLINFO_SIZE_UPLOAD 上一次上传的下载总量
//释放CURL句柄所占资源
void curl_easy_cleanup(struct Curl_easy *data)
2.读入数据
代码示例:
int main(void) {
CURL *curl;
CURLcode res;
long response_code; // 用于存储响应代码
FILE* fp = NULL;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
// 设置 HTTPS URL
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
// 关闭 SSL 证书验证(不推荐在生产环境中使用)
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
// 执行请求
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
if(res == CURLE_OK) {
printf("Response Code: %ld\n", response_code);
}
// 清理 CURL 句柄
curl_easy_cleanup(curl);
}
return 0;
}
总结
介绍了curl命令参数自定义方法,libcurl库的基本函数接口和使用方法。