简介
本文是curl初级和高级功能的说明,如果有些参数在执行过程中不支持,请curl -v
检查版本,本文档全部参数都要成功需要版本为7.87
。curl文档链接:https://curl.se/docs/manpage.html
基本功能
get请求
1
| curl https://www.liuquanhao.com/
|
带”&”参数的请求,因为”&”是linux shell的后台运行参数,需要用双引号引入标记为字符串
1
| curl "https://www.liuquanhao.com/?a=1&b=2"
|
获取请求详细信息
1
| curl -v https://www.liuquanhao.com/
|
1
| curl -I https://www.liuquanhao.com/
|
1
| curl -H "Content-type:application/json" -H "Accept-Content:application/json" https://www.liuquanhao.com/
|
带上referer请求,防盗链会使用此参数
1
| curl --referer "https://www.liuquanhao.com/" https://www.liuquanhao.com/1.png
|
跟随301/302/303跳转
1
| curl -L https://www.liuquanhao.com/
|
301/302/303跳转后为post请求,默认跳转后为get请求
1
2
3
| curl --post301 -L -d "data" https://www.liuquanhao.com/
curl --post302 -L -d "data" https://www.liuquanhao.com/
curl --post303 -L -d "data" https://www.liuquanhao.com/
|
使用代理请求
1
2
| curl -x http://proxy.cn/ https://www.liuquanhao.com/
curl --socks5 127.0.0.1:1080 https://www.liuquanhao.com/
|
使用fastopen和nodelay请求
1
| curl --tcp-fastopen --tcp-nodelay http://proxy.cn/ https://www.liuquanhao.com/
|
按原文件名下载文件
1
| curl -O https://www.liuquanhao.com/assets/1.png
|
使用”#”作为进度条下载文件
1
| curl -# -O https://www.liuquanhao.com/assets/1.png
|
使用安静模式下载
1
| curl -s https://www.liuquanhao.com/ -o download.txt
|
自定义名称下载文件
1
| curl https://www.liuquanhao.com/ -o download.txt
|
批量下载
1
| curl "https://www.liuquanhao.com/{1, 2}.zip" -o "file_#1.zip"
|
批量下载
1
| curl "https://{zip1, zip2}.liuquanhao.com/[1-10].zip" -o "#1_#2.zip"
|
并行下载文件
1
| curl -Z "https://{zip1, zip2}.liuquanhao.com/[1-10].zip" -o "#1_#2.zip"
|
下载文件的部分字节
1
2
3
4
5
6
| curl -r 0-99 https://liuquanhao.com/
curl -C - https://liuquanhao.com/
curl -C 100 https://liuquanhao.com/
curl -r 100-199 https://liuquanhao.com/
curl -r -200 https://liuquanhao.com/
|
限制每秒2个请求
1
| curl --rate 2/s https://www.liuquanhao.com/ -o download.txt
|
限制下载速率为100KB/s
1
| curl --limit-rate 100K https://www.liuquanhao.com/ -o download.txt
|
post请求
1
| curl -X POST https://www.liuquanhao.com/
|
post带参数
1
| curl -X POST -d "hello=world" https://www.liuquanhao.com/
|
post带文件
1
| curl -X POST -d "@test.txt" https://www.liuquanhao.com/
|
put请求
1
| curl -X PUT -d "hello=world" https://www.liuquanhao.com/
|
不做ssl证书验证
1
| curl get -k https://www.liuquanhao.com/
|
发送json请求
1
| curl -X POST -d '{"hello": "world"}' --header "Content-Type: application/json" --header "Accept: application/json" https://www.liuquanhao.com/
|
发送json请求
1
| curl --json '{ "hello": "world" }' https://www.liuquanhao.com/
|
高级功能
获取返回状态码
需要使用”-s -o /dev/null”避免页面数据显示影响结果
1
| curl -s -o /dev/null -w '%{http_code}\n' https://www.liuquanhao.com/
|
获取请求各项状态数据
1
2
3
4
5
6
7
8
9
10
11
12
| cat << EOF > curl-detail.txt
time_namelookup: %{time_namelookup}s\n
time_connect: %{time_connect}s\n
time_appconnect: %{time_appconnect}s\n
time_pretransfer: %{time_pretransfer}s\n
time_redirect: %{time_redirect}s\n
time_starttransfer: %{time_starttransfer}s\n
----------\n
time_total: %{time_total}s\n
EOF
curl -w "@curl-detail.txt" -o /dev/null -s "https://www.liuquanhao.com/"
|
其他状态参数说明
- content_type: header中的Content-Type
- errormsg: 错误信息
- exitcode: 退出码
- filename_effective: 最终写入本地的文件名,需要配合-o参数才有意义
- ftp_entry_path: 登录ftp时最终的路径
- header_json: 返回参数的所有header组成的json
- http_code: http返回码
- http_connect: 通过代理地址时,获取链路最后一个请求的返回码
- http_version: http版本
- local_ip: 本地ip
- local_port: 本地端口
- method: 请求方法
- num_connects: 请求连接数
- num_headers: header数量,跳转重新计算
- num_redirects: 跳转次数
- proxy_ssl_verify_result: 代理ssl验证结果
- redirect_url: 实际跳转链接
- referer: referer参数
- remote_ip: 远程ip
- remote_port: 远程端口
- response_code: 返回码,原来为http_code
- scheme: 请求协议
- size_download: 下载字节数
- size_header: header字节数
- size_request: 请求字节数
- size_upload: 上传文件字节数,包括文件和请求参数,不包括header
- speed_download: 下载速率
- speed_upload: 上传速率
- ssl_verify_result: ssl验证结果
- stderr: 如果加入此变量,返回将写入stderr
- stdout: 默认,返回写入到stdout
- time_appconnect: 开始到ssl完成的秒数
- time_connect: 开始到tcp连接完成的秒数
- time_namelookup: 开始到dns解析完成的秒数
- time_pretransfer: 传输前的所有准备花费的秒数,例如有101协议切换,能统计到此时间
- time_redirect: 所有重定向的秒数
- time_starttransfer: 开始到到接收到地一个字节的秒数,包括ime_pretransfer和服务器处理时间
- time_total: 整个请求花费的秒数
- url: 请求的url
- urlnum: 请求的url数量
- url_effective: 最终请求的url,如果用重定向跳转,将是跳转最后请求的url
关于请求时间的解释
本地应用(如chrome)请求时间花费: 本地程序初始化/请求排队延迟时间 + dns解析时间(可缓存)+ tcp握手时间 + ssl握手时间(如果是https请求) + 服务器处理业务时间 + 返回数据时间
- time_namelookup = 本地程序初始化时间 + dns解析时间
- time_connect = time_namelookup + tcp握手时间
- time_appconnect = time_connect + ssl握手时间
- time_pretransfer = time_connect(或time_appconnect,https时)+ 其他处理时间(开始请求之前的花费,如time_redirect时间)
- time_starttransfer = time_pretransfer + 服务器处理时间 + 第一个字节从服务器发送到客户端的时间
- time_total = time_starttransfer + 返回数据花费的时间