一、换源

二、安装

1、软件源安装

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install curl

2、源码安装

*注释:如果需要openssl、zlib,则在编译curl之前,先要编译和安装openssl和zlib

下载curl源码,下载地址curl downloads

解压到选择目录//笔者解压到了/home/curl下
cd /home/curl
sudo chmod 777 ./configure 
./configure --prefix --with-ssl=/usr/local/openssl 
//--prefix=DIR 生成文件的输出目录
//--with-ssl=SSLDIR 指定使用的openssl目录  
//--without-ssl 若无需ssl(https需要)支持,则不指定--with-ssl或指定--without-ssl
//--with-zlib=ZLIBDIR 指定使用的zlib目录
//--disable-shared 关闭编译动态库,即编译静态库
make
make install
cd DIR  //进入安装位置
ls //此时应当能看见include、bin、lib和share文件夹

三、使用

cd ./bin
ls //可以看到curl、curl-config两个文件,curl就是使用的程序
./curl -V  查看curl版本
./curl -v <url> 打印更多信息,包括发送的请求信息
./curl -s <url> 减少输出的信息,比如进度
./curl -i <url> 显示html全部信息
./curl -l <url> 只显示<head>元素信息
./curl -I <url> 仅返回头部信息,使用HEAD请求
./curl -x <proxyhost[:port]> <url> 指定代理服务器地址和端口,端口默认为1080
./curl -m <seconds> <url> 指定处理的最大时长
./curl --connect-timeout <seconds> <url> 指定尝试连接的最大时长
./curl --retry <num> <url> 指定重试次数

//<url> = "http://xhqm.xyz/index.html"

1、GET请求

curl "http://xhqm.xyz/index.html",回车之后,HTML内容打印在屏幕上
curl "http://xhqm.xyz/index.html" -o FILE 将网页保存至文件 当URL指向文件时,则下载文件
curl "http://xhqm.xyz/index.html" > FILE 将网页保存至文件 当URL指向文件时,则下载文件
curl -T FILE <url> 上传文件
curl -T "{FILE1,FILE2}" <url> 上传多个文件
curl -T FILE ftp://ftp.xhqm.xyz/updata/ 上传多个文件到ftp服务器

2、PUT请求

3、POST请求

curl -d "op1=var1&op2=var2" <url/api> 需把请求的参数和URL分开,
curl -d "op1=var1" -d "op2=var2" <url/api> 提交两个参数。特殊字符需先转义
curl --data-urlencode "op1=var1" <url/api> 自动转义特殊字符
curl -F "filename=@/home/xhqm.txt" <url> 上传文件,不能漏掉@符号

4、DELETE请求

5、其他

curl -A "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36" <url> //伪装为Chrome浏览器

curl --cookie "op1=var1" <url> //使用cookie
curl -b /cookie.txt <url> //使用文件中的cookie
curl -c ./cookie.txt -d "user=admin" -d "pass=123456" <url> 保存生成的cookie到文件

curl -o /dev/null -s -w %{http_code} <url> 打印出返回的http码
curl -o /dev/null -s -w "time_total: %{time_total}\n" <url> 打印响应时间

四、curl库的使用

1、环境配置

#define USE_OPENSSL  //是否使用openssl
#define CURL_STATICLIB //是否使用静态库
#include "curl/curl.h" //curl头文件
#pragma comment(lib,"libcurl.lib") //引入curl的lib库

//使用openssl时,需要引入以下lib库
//当在Windows下时,需要引入以下lib库
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"crypt32.lib")
#pragma comment(lib,"wldap32.lib")
//使用openssl动态库时
#pragma comment(lib,"openssl/lib/libssl.lib")
#pragma comment(lib,"openssl/lib/libcrypto.lib")
//使用openssl静态库时
#pragma comment(lib,"openssl/lib/libssl_static.lib")
#pragma comment(lib,"openssl/lib/libcrypto_static.lib")
*注意#pragma comment在Ubuntu下应当不支持,注意配置环境的方式

2、API说明

curl_global_init(CURL_GLOBAL_ALL);  //初始化curl,一个程序调用一次即可
curl_global_cleanup();  //结束curl使用,一个程序调用一次即可
//CURL_GLOBAL_NOTHING 不初始化
//CURL_GLOBAL_SSL 初始化SSL支持
//CURL_GLOBAL_WIN32 初始化WIN平台,//仅win下生效
//CURL_GLOBAL_ALL 初始化全部 //建议

CURL* curlptr = curl_easy_init();  //初始化一个curl句柄
curl_easy_cleanup(curlptr);  //关闭curl句柄

curl_slist* headers = nullptr;//头信息句柄
curl_slist_append(headers, const char*);//增加一条头
curl_slist_free_all(headers);//释放头信息句柄

CURLcode res = curl_easy_setopt(curlptr, CURLoption option, void *);//设置各项参数
curl_easy_setopt(curlptr, CURLOPT_URL, const char*url);//示例 设置url
//CURLOPT_PORT, int  //设置端口号
//CURLOPT_FOLLOWLOCATION, bool  //设置自动跳转
//CURLOPT_POSTFIELDS, const char*  //设置post上交的数据
//CURLOPT_CUSTOMREQUEST, const char*  //设置请求类型  "GET" "PUT" "POST" "DELETE"
//CURLOPT_SSL_VERIFYPEER, bool  //是否跳过证书检查
//CURLOPT_SSL_VERIFYHOST, bool  //检查SSL加密算法是否存在
//CURLOPT_CONNECTTIMEOUT, long long  //设置连接超时时间
//CURLOPT_TIMEOUT, long long  //设置写入超时时间
//CURLOPT_HEADER, bool  //是否返回头信息
//CURLOPT_NOBODY, bool  //是否不返回体信息
//CURLOPT_NOSIGNAL, bool  //
//CURLOPT_VERBOSE, bool  //

//typedef long long(CURL_CallBackW)(void*, long long, long long, void*);
//CURLOPT_WRITEFUNCTION, CURL_CallBackW*  //写入回调函数 连接结束时
//CURLOPT_WRITEDATA, void*  //传入写入回调函数的数据

//typedef long long(CURL_CallBackR)(void*, long long, long long, void*);
//CURLOPT_READFUNCTION, CURL_CallBackR*  //读取回调函数 连接开始时
//CURLOPT_RRITEDATA, void*  //传入读取回调函数的数据

CURLcode res = curl_easy_perform(curlptr);//进行一次连接
//返回值 错误码
//CURLE_OK = 0  //成功
//其余返回值看curl代码

3、代码示例

#define USE_OPENSSL  //是否使用openssl
#define CURL_STATICLIB //是否使用静态库
#include "curl/curl.h" //curl头文件
#pragma comment(lib,"libcurl.lib") //引入curl的lib库

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"crypt32.lib")
#pragma comment(lib,"wldap32.lib")
#pragma comment(lib,"openssl/lib/libssl_static.lib")
#pragma comment(lib,"openssl/lib/libcrypto_static.lib")

int main()
{
curl_global_init(CURL_GLOBAL_ALL);  //初始化curl,一个程序调用一次即可
CURL *curl = curl_easy_init();  //初始化一个curl句柄
if(curl) 
{
  struct curl_slist *headers = NULL;
  headers = curl_slist_append(headers, "Content-Type: text/plain");
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

  const char *data = "{\"boxLocal\":\"string\",\"flatness\":0}";
  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);

  curl_easy_setopt(curl, CURLOPT_URL, "http://xhqm.xyz");
  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
  curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
  curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");

  CURLcode res = curl_easy_perform(curl);
}
curl_easy_cleanup(curl);  //关闭curl句柄
curl_global_cleanup();  //结束curl使用,一个程序调用一次即可
return 0;
}

————星辉20220902