% T8 X4 d# _9 O( f3 x( s
简介curl 是常用的命令行工具,用来请求 Web 服务器它的名字就是客户端(client)的 URL 工具的意思它的功能非常强大,命令行参数多达几十种如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。 ; ]2 d# R+ m- j4 c- h( l, r9 p5 c
本文介绍它的主要命令行参数,作为日常的参考,方便查阅内容主要翻译自《curl cookbook》为了节约篇幅,下面的例子不包括运行时的输出,初学者可以先看我以前写的《curl 初学者教程》不带有任何参数时,curl 就是发出 GET 请求。 / D) V* P3 B1 W. }
$ curl https://www.example.com
7 U% O. | v% K 上面命令向http://www.example.com发出 GET 请求,服务器返回的内容会在命令行输出-A-A参数指定客户端的用户代理标头,即User-Agent。
' V, @) R* K( p1 Q curl 的默认用户代理字符串是curl/[version]$ curl -A Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 https://google.com
) e3 R3 q/ P+ H- h& n$ p7 v
; t: \5 y9 V1 _+ c" {8 ` y 上面命令将User-Agent改成 Chrome 浏览器$ curl -A https://google.com& w! `1 n. N& `) m- X
上面命令会移除User-Agent标头也可以通过-H参数直接指定标头,更改User-Agent。
( W2 v7 T+ ?8 |' V7 p $ curl -H User-Agent: php/1.0 https://google.com
5 X" P/ u3 c" q2 i -b-b参数用来向服务器发送 Cookie$ curl -b foo=bar https://google.com
/ r, o4 g. ?6 \ v/ d9 ~ 。 ) Z7 w& X) ] d" C
上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie$ curl -b foo1=bar;foo2=bar2 https://google.com! l, b0 D, M7 t4 g9 _2 W1 j) C
。 3 j) ^- F1 h; n' x. @
上面命令发送两个 Cookie$ curl -b cookies.txt https://www.google.com
$ Q% }- [% H5 w% P+ M# ~0 b 上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。 : p6 u# Q4 H2 A* d& }: X
-c-c参数将服务器设置的 Cookie 写入一个文件$ curl -c cookies.txt https://www.google.com
$ X, ^. z2 E. ^0 b7 K" G 上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。
H* c& h7 p& S( V- N- t9 S& ~7 U* f -d-d参数用于发送 POST 请求的数据体$ curl -dlogin=emma&password=123-X POST https://google.com/login% B1 `( z& p7 ~8 h" ^: r$ L
# 或者
* ~& i7 V4 x0 ]% ?+ h $ curl -d login=emma -d password=123 -X POST https://google.com/login& o, }5 V: A5 J8 \
。 ( s% ^& Q# x8 B" {7 b: z
使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded并且会自动将请求转为 POST 方法,因此可以省略-X POST。 8 i3 [( v6 b! e# r1 k
-d参数可以读取本地文本文件的数据,向服务器发送$ curl -d @data.txt https://google.com/login+ {7 t1 j1 V- y1 t
上面命令读取data.txt文件的内容,作为数据体向服务器发送--data-urlencode % l9 v1 c, }1 D6 l$ B
--data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码$ curl --data-urlencode comment=hello world https://google.com/login
# Q, J9 i$ C9 }, G& u9 f2 j 。 X! |# I/ s; A- U L6 M
上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码-e-e参数用来设置 HTTP 的标头Referer,表示请求的来源$ curl -e https://google.com?q=example https://www.example.com
, n7 r Q2 k" p" Z 。 5 z3 n5 _/ L9 b2 b
上面命令将Referer标头设为https://google.com?q=example-H参数可以通过直接添加标头Referer,达到同样效果curl -H Referer: https://google.com?q=example https://www.example.com3 y5 w& s- t" ^1 j5 J! m8 C8 x) [
。
+ v( Y; E8 n1 t1 V: s9 l -F-F参数用来向服务器上传二进制文件$ curl -F file=@photo.png https://google.com/profile
1 u+ M. o8 W9 @( M" P2 Y6 ~ 上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。 0 J5 \6 h4 _( d9 ?" y4 c
-F参数可以指定 MIME 类型$ curl -F file=@photo.png;type=image/png https://google.com/profile n, x3 `) o9 j+ E7 E( v
上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。 ) c2 U' I# s% J
-F参数也可以指定文件名$ curl -F file=@photo.png;filename=me.png https://google.com/profile
3 O# K6 n) G/ v! R1 I5 r 上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。 * a% y4 V) o5 M- e/ n: E, v
-G-G参数用来构造 URL 的查询字符串$ curl -G -d q=kitties -d count=20 https://google.com/search. a6 e$ q9 \+ z9 W& X+ g* Z2 @" w l
上面命令会发出一个 GET 请求,实际请求的 URL 为。
, o2 I6 R2 g/ Z2 R: y4 F- n* y https://google.com/search?q=kitties&count=20如果省略--G,会发出一个 POST 请求如果数据需要 URL 编码,可以结合--data--urlencode参数。
- Z9 L9 f2 X( M4 f3 u- [- D) s $ curl -G --data-urlencode comment=hello world https://www.example.com
. b. v5 Q- u* Q9 d0 h -H-H参数添加 HTTP 请求的标头$ curl -H Accept-Language: en-US https://google.com( I3 H6 ?: _2 z7 `. ?
。 3 @2 P. Y- r; u' K
上面命令添加 HTTP 标头Accept-Language: en-US$ curl -H Accept-Language: en-US -H Secret-Message: xyzzy https://google.com
) ~8 @5 n' U8 D* v3 x% r w 。 0 l8 s4 V3 P$ v( Z" L$ b
上面命令添加两个 HTTP 标头$ curl -d {"login": "emma", "pass": "123"} -H Content-Type: application/json https://google.com/login
0 N, d. ^# r9 T% L# N$ g7 o) } 。 " I! V, x2 x l, ?; {
上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据-i-i参数打印出服务器回应的 HTTP 标头$ curl -i https://www.example.com" z9 i- w6 }/ I) m: }5 ^% Q0 L$ ?! U; A% v
。
( g0 B/ @ U) d b% r 上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码-I-I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来$ curl -I https://www.example.com8 |1 R% q4 r+ u4 `/ N
。
! `( P( [# m" p; {$ _% d8 D 上面命令输出服务器对 HEAD 请求的回应--head参数等同于-I$ curl --head https://www.example.com' X8 n6 c$ R' @$ E3 w
-k-k参数指定跳过 SSL 检测$ curl -k https://www.example.com: G% ~4 R2 P" B$ L# x
。 4 e7 e X% j; \6 V# F& p
上面命令不会检查服务器的 SSL 证书是否正确-L-L参数会让 HTTP 请求跟随服务器的重定向curl 默认不跟随重定向$ curl -L -d tweet=hi https://api.twitter.com/tweet5 a4 D, e; U$ L2 T+ S
。 1 b* d* w, g9 _; A
--limit-rate--limit-rate用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境$ curl --limit-rate 200k https://google.com
5 L. ]8 ?8 D) g8 C# J) h/ j6 o 上面命令将带宽限制在每秒 200K 字节。
+ G1 r" _0 }8 Q) W# `. r -o-o参数将服务器的回应保存成文件,等同于wget命令$ curl -o example.html https://www.example.com$ w' g" E2 C4 e" Y5 L
上面命令将http://www.example.com保存成example.html。 5 b' S1 I' F- R' j* a
-O-O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名$ curl -O https://www.example.com/foo/bar.html1 ]6 s+ u3 c( R3 m) `: i5 M7 v
上面命令将服务器回应保存成文件,文件名为bar.html。 " q% o2 s, l: @0 n% u$ \
-s-s参数将不输出错误和进度信息$ curl -s https://www.example.com" Z/ j J4 ~: f N [+ }
上面命令一旦发生错误,不会显示错误信息不发生错误的话,会正常显示运行结果如果想让 curl 不产生任何输出,可以使用下面的命令。 / ]9 q7 Z4 r5 M
$ curl -s -o /dev/null https://google.com
2 I; H$ w, r' e2 P( @' N -S-S参数指定只输出错误信息,通常与-s一起使用$ curl -S -s -o /dev/null https://google.com! P) ]' @* ?4 q4 i% A
。
# j& n7 F2 l# A S! H7 v 上面命令没有任何输出,除非发生错误-u-u参数用来设置服务器认证的用户名和密码$ curl -u bob:12345 https://google.com/login
; y5 S6 s. S8 ~. i5 N, j& j6 n 上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1。
3 E, t3 ^) ]2 s0 [3 g _2 t curl 能够识别 URL 里面的用户名和密码$ curl https://bob:12345@google.com/login
) j. T V' m# W! U" N, y 上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。
# m8 A: u- I3 y2 F; T, ? $ curl -u bob https://google.com/login( b; b; w% `+ a5 b4 |
上面命令只设置了用户名,执行后,curl 会提示用户输入密码-v-v参数输出通信的整个过程,用于调试$ curl -v https://www.example.com
3 s& d3 d, e+ R 。
( Y2 m/ B- C: x7 d9 H: N* @ --trace参数也可以用于调试,还会输出原始的二进制数据$ curl --trace - https://www.example.com. W I8 f# Z9 e
-x-x参数指定 HTTP 请求的代理$ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
4 H6 e' n! J. D# E& _ 。 2 _) b: w2 Z" `( n6 \4 D
上面命令指定 HTTP 请求通过http://myproxy.com:8080的 socks5 代理发出如果没有指定代理协议,默认为 HTTP$ curl -x james:cats@myproxy.com:8080 https://www.example.com4 B/ G2 O: i: h$ q2 f
。 ; U+ v3 v. o! I( Y4 D2 N) Q. d- Y
上面命令中,请求的代理使用 HTTP 协议-X-X参数指定 HTTP 请求的方法$ curl -X POST https://www.example.com& P' v3 E# z# u0 [
上面命令对https://www.example.com发出 POST 请求。 6 ~8 v/ E' x6 ~9 o$ }/ k
原文链接:http://www.ruanyifeng.com/blog/2019/09/curl-reference.html 作者: 阮一峰
1 W: A8 }9 }# |, q0 [ F) e: z
# o* e8 [% Y3 Q r8 l" ?# x( a8 @1 G
& s1 q( B n O l# ?
: s: q6 f* |: z/ Y
|