CURL杂记

1. 常用方法

1.1 POST数据提交

1
curl -X POST -d 'keyword=linux' http://www.baidu.com

1.2 指定请求头

1
curl -H 'Content-Type:application/json' -H 'keyword:linux' http://www.baidu.com

2. 常用参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-b, --cookie <data>              传输Cookie,格式为"NAME1=VALUE1; NAME2=VALUE2",若无"=",表名为文件名
-d, --data DATA HTTP POST数据
-F, --form <name=content/@file> 模拟HTTP表单数据提交(Content-Type multipart/form-data),可用@引用文件,可以多参数进行拼接
-G, --get 使用HTTP GET方法发送-d数据
-H, --header <header/@file> 指定HTTP header,可用@引用文件,可以多参数进行拼接
-I, --head 仅显示响应文档头
-o, --output <file> 输出文件
-x, --proxy [PROTOCOL://]HOST[:PORT] 指定代理
-e, --referer Referer,亦可用-H来实现
-X, --request <command> HTTP命令
--resolve <host:port:address[,address]...> 域名解析
-s, --silent 静默模式,不显示进度和错误信息
--tcp-nodelay 使用TCP_NODELAY选项
-T, --upload-file <file> 文件上传
-A, --user-agent <name> 指定User-Agent,亦可用-H实现
-v, --verbose 显示详细操作信息
-w, --write-out <format/@file> 结束后额外信息输出,可用@指定格式文件,具体参数参见 https://curl.haxx.se/docs/manpage.html#-w

3. 时间统计

CURL可以通过-w,配合-o /dev/null和-s可以专门测量HTTP请求的时间消耗。

示例:

1
2
3
4
5
6
7
8
9
10
curl -w "\n\
time_namelookup: %{time_namelookup}\n\
time_connect: %{time_connect}\n\
time_appconnect: %{time_appconnect}\n\
time_pretransfer: %{time_pretransfer}\n\
time_redirect: %{time_redirect}\n\
time_starttransfer: %{time_starttransfer}\n\
--------------------------------\n\
time_total: %{time_total}\n\
\n" -o /dev/null -s http://www.baidu.com

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vagrant@debian:~/blog$ curl -w "\n\
> time_namelookup: %{time_namelookup}\n\
> time_connect: %{time_connect}\n\
> time_appconnect: %{time_appconnect}\n\
> time_pretransfer: %{time_pretransfer}\n\
> time_redirect: %{time_redirect}\n\
> time_starttransfer: %{time_starttransfer}\n\
> --------------------------------\n\
> time_total: %{time_total}\n\
> \n" -o /dev/null -s http://www.baidu.com

time_namelookup: 0.004284
time_connect: 0.037377
time_appconnect: 0.000000
time_pretransfer: 0.037483
time_redirect: 0.000000
time_starttransfer: 0.071478
--------------------------------
time_total: 0.071703

-w参数可以通过@引用格式文件,将下述格式保存为curl-format,可以直接使用命令curl -w "@curl-format" -o /dev/null -s http://www.baidu.com

1
2
3
4
5
6
7
8
9
10
\n
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n
time_pretransfer: %{time_pretransfer}\n
time_redirect: %{time_redirect}\n
time_starttransfer: %{time_starttransfer}\n
--------------------------------\n
time_total: %{time_total}\n
\n

时间参数个人理解(各时间均为命令起始至对应节点的时间):

1
2
3
4
5
6
7
time_namelookup    DNS解析完成时间
time_connect TCP建立连接时间
time_appconnect SSL/SSH/etc完成时间
time_pretransfer CURL发送结束,开始等待服务器传输的时间(?)
time_redirect 重定向时间(仅重定向时间,不从起始计时)
time_starttransfer CURL接收到服务端首个字节的时间
time_total 总时间