blog/20201030072137_f1e70036ab2957d97d13318e27ee89a3.png

一,curl 简介 链接到标题

curl 是常用的命令行工具,可基于网络协议,对指定 URL 进行网络传输。支持的通信协议有 DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SBMS, SMTP, SMTPS, TELNET 和 TFTP。

1.1. 语法 链接到标题

$ curl [选项] [url] 

1.2. 参数 链接到标题

# 调试类
-v, --verbose                          输出信息
-q, --disable                          在第一个参数位置设置后 .curlrc 的设置直接失效,这个参数会影响到 -K, --config -A, --user-agent -e, --referer
-K, --config FILE                      指定配置文件
-L, --location                         跟踪重定向 (H)

# CLI显示设置
-s, --silent                           Silent模式。不输出任务内容
-S, --show-error                       显示错误. 在选项 -s 中,当 curl 出现错误时将显示
-f, --fail                             不显示 连接失败时HTTP错误信息
-i, --include                          显示 response的header (H/F)
-I, --head                             仅显示 响应文档头
-l, --list-only                        只列出FTP目录的名称 (F)
-#, --progress-bar                     以进度条 显示传输进度

# 数据传输类
-X, --request [GET|POST|PUT|DELETE|]  使用指定的 http method 例如 -X POST
-H, --header <header>                  设定 request里的header 例如 -H "Content-Type: application/json"
-e, --referer                          设定 referer (H)
-d, --data <data>                      设定 http body 默认使用 content-type application/x-www-form-urlencoded (H)
    --data-raw <data>                  ASCII 编码 HTTP POST 数据 (H)
    --data-binary <data>               binary 编码 HTTP POST 数据 (H)
    --data-urlencode <data>            url 编码 HTTP POST 数据 (H)
-G, --get                              使用 HTTP GET 方法发送 -d 数据 (H)
-F, --form <name=string>               模拟 HTTP 表单数据提交 multipart POST (H)
    --form-string <name=string>        模拟 HTTP 表单数据提交 (H)
-u, --user <user:password>             使用帐户,密码 例如 admin:password
-b, --cookie <data>                    cookie 文件 (H)
-j, --junk-session-cookies             读取文件中但忽略会话cookie (H)
-A, --user-agent                       user-agent设置 (H)

# 传输设置
-C, --continue-at OFFSET               断点续转
-x, --proxy [PROTOCOL://]HOST[:PORT]   在指定的端口上使用代理
-U, --proxy-user USER[:PASSWORD]       代理用户名及密码

# 文件操作
-T, --upload-file <file>               上传文件
-a, --append                           添加要上传的文件 (F/SFTP)

# 输出设置
-o, --output <file>                    将输出写入文件,而非 stdout
-O, --remote-name                      把输出写到该文件中,保留远程文件的文件名 
-D, --dump-header <file>               将头信息写入指定的文件
-c, --cookie-jar <file>                操作结束后,要写入 Cookies 的文件位置

curl 命令向 www.qq.com 发出 GET 请求,服务器返回的内容会在命令行输出。

$ curl http://www.qq.com

二,curl 使用场景 链接到标题

由于 curl 功能非常强大,命令行参数多达几十种,不易记忆。固作者将常用场景进行了收集记录。

2.1. 分析请求耗时 链接到标题

curl 命令分析请求耗时的示列

  • 打印输出信息格式

-w 选项,可以从文件读取要打印信息的格式,如下定义文件 curl-w.txt 内容:

\n
http_code:  %{http_code}\n
content_type:  %{content_type}\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
speed_download:  %{speed_download}\n
speed_upload:  %{speed_upload}\n
size_download:  %{size_download}\n
size_upload:  %{size_upload}\n
----------\n
time_total:  %{time_total}\n
\n
  • 变量含义
http_code :上一次 HTTP 或 FTP 数据传输过程中的 response 数值代码。

content_type :被请求访问的文件的 Content_Type 类型。 

time_namelookup :从数据传输开始到域名解析完成所花费的时间,即DNS解析时间。

time_connect :TCP连接建立成功所花费的时间。 

time_appconnect :应用层协议,如 SSL/SSH、三次握手等过程完成所花费的时间。

time_pretransfer :从请求开始到响应开始传输的时间 

time_redirect :从跳转链接被激活到真正开始从跳转链接下载数据所经过的时间。 

time_starttransfer :从请求连接开始,到第一个字节被传送前所经过的时间。

speed_download :整个数据传输过程中的平均数据下载速度。 

speed_upload :整个数据传输过程中的平均数据上传速度。 

size_download :数据传输过程中下载的总数据大小。

size_upload :数据传输过程中上传的总数据大小。

time_total :数据传输消耗的总时间,以秒为单位,精度为毫秒。 

# TCP 连接时间 = time_pretransfter - time_namelookup

# 服务器处理时间 = time_starttransfter - time_pretransfer

# 内容传输时间 = time_total - time_starttransfer
  • 发送 curl 请求
$ curl https://www.qq.com -w "@curl-w.txt" -o /dev/null -s

-w:从文件中读取要打印信息的格式

-o /dev/null:把响应的内容丢弃,因为我们这里并不关心它,只关心请求的耗时情况

-s:不要打印进度条

2.2. GET 请求 链接到标题

curl 命令发送 GET 请求示列

$ curl -v https://apinew.juejin.im/tag_api/v1/query_category_briefs?show_type=0

# -G 用来发送 GET 请求,-d, 查询参数
$ curl -G -d 'show_type=0' -d 'b=2' https://apinew.juejin.im/tag_api/v1/query_category_briefs

# --data-urlencode 进行 URL 编码
$ curl -v  -G -d 'show_type=0' --data-urlencode 'b=2 3  4' https://apinew.juejin.im/tag_api/v1/query_category_briefs

2.3. POST 请求 链接到标题

curl 命令发送 POST 请求示列

# -d 参数发送参数,默认 Content-Type : application/x-www-form-urlencoded
$ curl -d "id_type=2"  https://apinew.juejin.im/recommend_api/v1/article/recommend_all_feed

# 设置请求头
$ curl -d '{"id_type":2,"client_type":2608,"sort_type":200,"cursor":"0","limit":20}' -H "Content-Type: application/json" -v --trace-ascii /dev/stdout  https://apinew.juejin.im/recommend_api/v1/article/recommend_all_feed

# -d 参数可以读取本地文本文件的数据
$ curl -d '@data.json' -H "Content-Type: application/json" --trace-ascii /dev/stdout https://apinew.juejin.im/
  • --trace-ascii /dev/stdout 显示详细的请求过程,输出到命令端。--trace-ascii output.txt 输出到文件

2.4. 模拟网络环境 链接到标题

--limit-rate 用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。

# 将带宽限制在每秒 1K 字节
$ curl -d "id_type=2" --limit-rate 1k  https://apinew.juejin.im/recommend_api/v1/article/recommend_all_feed

-b 命令读取 Cookie 数据,并携带到请求头,模拟用户登陆,保持会话

$ curl -b ./cookie.txthttps://apinew.juejin.im/interact_api/v1/message/count

2.6. 下载保存 链接到标题

$ curl https://www.qq.com > qq.html

$ curl -o qq.html https://www.qq.com

$ curl -O http://mydomain.net/target.tar.gz

2.7. 使用代理 链接到标题

# 指定 HTTPS 请求通过 `127.0.0.1:8080` 代理发出
$ curl -x 127.0.0.1:8080 https://www.qq.com

2.8. 批量发送请求 链接到标题

for i in {0..100}; do curl -X GET  https://www.qq.com -o /dev/null ;  done

2.9. 上传文件 链接到标题

-F 参数用来向服务器上传二进制文件,会给 HTTP 请求加上标头 Content-Type: multipart/form-data,然后将文件 photo.png 作为 file 字段上传

curl -F 'file=@photo.png' https://google.com/profile

# 指定 MIME 类型为 image/png
$ curl -F 'file=@photo.png;type=image/png' https://google.com/profile

# 指定文件名服务器中的文件名,原始文件名为 photo.png,但是服务器接收到的文件名为me.png
$ curl -F 'file=@photo.png;filename=me.png' https://google.com/profile

2.10. 免配 hosts 链接到标题

$ curl -v -H "Host: www.qq.com" http://127.0.0.1:4000

参考 链接到标题