一文了解curl常用及特殊用法

curl脑图

一、常规用法

最常用的是直接请求,默认是GET方法

curl <https://baidu.com>

1.1 自定义header

添加header使用 -H, --header

curl -H "X-MY-HEADER: abc" <https://baidu.com>

如果想添加多个header,那么就写多次

curl -H "X-MY-HEADER: abc" -H "X-MY-HEADER2: def" <https://baidu.com>

1.2 请求方法

有些时候想要post或者put请求,可以使用 -X, --request <method> 来自设置

curl -X POST <https://baidu.com>

当post的时候想要传输body参数,可以使用 -d, --data <data> 来设置

curl -X POST -d "name=abc&gender=0" <https://example.com>
或者
curl -X POST -d name=bac -d gender=0 <https://example.com>

1.3 设置cookie

需要添加cookie来请求,可以使用 -b, --cookie 来设置

curl -b "token=abcdef;uid=123123" <https://example.com>

那如果想要把返回的cookie存储起来呢,可以用 -c, --cookie-jar <file> 来设置存储的位置

curl -c cookie.txt <https://www.baidu.com>

1.4 结果输出到文件

需要把请求的返回结果输出到文件,以便查看分析,可以用 -o, --output <file> 来设置输出到的文件

curl -o baidu.html <https://www.baidu.com>

示例如下图,会打印出整体进度和统计

二、多种协议

curl被人熟知的是系统自带的用来请求HTTP url的工具。但是,其不但可以处理http协议,还可以处理:FILE, FTP, FTPS, GOPHER, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP等。。。这么多协议,怎样,功能是不是很强大。

  • 用来发送邮件
curl --mail-from "abc@def.com" --mail-rcpt "12345566@qq.com" --upload-file mail.txt --user "user_name:password" --url "smtp://mail.qq.com"
  • 上传文件,使用 -T, --upload-file <file> 参数,同时可以批量上传, 用[] 来设置范围,示例如下。同时,下面会讲解如何处理多个url同时请求的情况。
curl -T "img[1-1000].png" <ftp://ftp.example.com/upload/>
或者
curl --upload-file "{file1,file2}" <http://www.example.com>

三、多个请求

最简单的使用方式是:curl <https://baidu.com> ,但是偶尔会有想同时请求多个url,能不能办的到呢,当然可以

curl https://{baidu,cnblogs}.com

这样的话就会顺序请求 https://baidu.com、https://cnblogs.com 这两个网站。(PS: 终端里显示{ 或}之前有\,是终端做的转义功能,请忽略。)

又有说请求的url不一定都是.com结尾呢,能不能办呢,那必须可以

curl https://{baidu.com,csdn.net}

又有人较真说,我请求的多个url协议都是不同的,比如:curl {<http://baidu.com>, <https://csdn.net>} , 能不能这么请求呢,那不好意思,这样不行,会解析错误。

这种用法多用于某个站点多种path或query的情况,比如

四、使用代理

可以使用 -x,--proxy [protocol://]host[:port] 参数 代理来请求目标网站

curl --proxy <http://127.0.0.1:1087> <https://baidu.com>

使用http的代理是可以来请求https目标网站的,其中原理是使用了http的proxy tunnel功能,这个在后续文章中会做详细介绍。

五、请求详情

有些时候想要知道详细的请求情况,比如怎么建立连接的,请求过程是如何的,那么可以这么来用,使用 -v ,--verbose

curl -v <https://baidu.com>

六、请求追踪

有了上面的详细请求可能还不太满足一些需求,比如想要知道花费建立连接时间、传输时间、相应时间等详细的性能信息,这个对于最终网络问题很有帮助,那么怎么办呢。

那就要拿出一个厉害的参数:-w, —write-out

比如下面的例子可以输出:发起链接时间,开始传输时间以及总花费时间。

curl -w 'time_connect %{time_connect}s\\ntime_starttransfer %{time_starttransfer}s\\ntime_total %{time_total}s\\n' <https://baidu.com>

可以来一个更详细的追踪

curl -w 'http_code: %{http_code}\\ncontent_type: %{content_type}\\ntime_namelookup: %{time_namelookup}\\ntime_connect: %{time_connect}\\ntime_appconnect: %{time_appconnect}\\ntime_redirect: %{time_redirect}\\ntime_pretransfer: %{time_pretransfer}\\ntime_starttransfer: %{time_starttransfer}\\nspeed_download: %{speed_download}\\nspeed_upload: %{speed_upload}\\nsize_download: %{size_download}\\nsize_upload: %{size_upload}\\n---------\\n time_total: %{time_total}\\n' <https://baidu.com>

结果如下图

-w 可以使用的变量比较多,常用的如下表所示:

  • url_effective 上次访问的URL
  • http_code 上一次 HTTP 或 FTP 数据传输过程中的 response 数值代码
  • http_connect 上一次 CONNECT 请求中的数值代码
  • time_total 数据传输消耗的总时间,以秒为单位,精度为毫秒。
  • time_namelookup 从数据传输开始到域名解析完成所花费的时间。 以秒为单位
  • time_connect TCP连接建立成功所花费的时间。 以秒为单位
  • time_appconnect 应用层协议,如 SSL/SSH、三次握手等过程完成所花费的时间。 以秒为单位
  • time_redirect 从跳转链接被激活到真正开始从跳转链接下载数据所经过的时间。 以秒为单位
  • time_starttransfer 从请求连接开始,到第一个字节被传送前所经过的时间。 以秒为单位
  • size_download 数据传输过程中下载的总数据大小。以字节为单位
  • size_upload 数据传输过程中上传的总数据大小。以字节为单位
  • size_header 下载的数据包中,header 字段的总数据大小。以字节为单位
  • size_request 被发送的 HTTP request 的总数据大小。以字节为单位
  • speed_download 整个数据传输过程中的平均数据下载速度。 以字节为单位
  • speed_upload 整个数据传输过程中的平均数据上传速度。 以字节为单位
  • content_type 被请求访问的文件的 Content_Type 类型。
  • num_redirects 访问请求中包含的跳转链接数量。
  • redirect_url 跳转链接指向的URL ssl_verify_result SSL验证的结果。值为 0 时表示验证成功。

七、设置重试

可以设置失败请求重试次数,以及最大重试次数、超时时间等。

  • —retry <num> 设置重试次数
  • —retry-delay <seconds> 设置重试时等待时间,秒级
  • —retry-max-time <seconds> 设置最大重试时间
  • -m, —max-time <seconds> 设置最大请求时间,即超时时间

例如,设置重复次数请求一个不存在的url

curl --retry 3 --retry-delay 1 --retry-max-time 10 <https://notexisturl.com>

例如,设置超时时间来请求

curl -m 1 <https://baidu.com>

举报
评论 0