找回密码
 加入怎通
查看: 195|回复: 0

curl 的用法指南(curl作用)

[复制链接]
我来看看 发表于 2023-03-17 18:06:46 | 显示全部楼层 |阅读模式
, V, Y7 h& F) {+ T* Y7 c

简介curl 是常用的命令行工具,用来请求 Web 服务器它的名字就是客户端(client)的 URL 工具的意思它的功能非常强大,命令行参数多达几十种如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。

9 ]: B6 {7 u8 U9 V$ S+ m: g

本文介绍它的主要命令行参数,作为日常的参考,方便查阅内容主要翻译自《curl cookbook》为了节约篇幅,下面的例子不包括运行时的输出,初学者可以先看我以前写的《curl 初学者教程》不带有任何参数时,curl 就是发出 GET 请求。

6 ?, Y) ^- X4 U1 o2 e

$ curl https://www.example.com " U* c5 T$ S6 N+ ^+ o* U$ |: @ 上面命令向http://www.example.com发出 GET 请求,服务器返回的内容会在命令行输出-A-A参数指定客户端的用户代理标头,即User-Agent。

' |* N! W0 t A+ l2 y$ I# I% B

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 ) M& d3 l: M! U: b1 ]/ q

9 Y O4 T$ i6 b4 K8 L% n

上面命令将User-Agent改成 Chrome 浏览器$ curl -A https://google.com 5 o1 T: E* u- e0 l; v" l; Y 上面命令会移除User-Agent标头也可以通过-H参数直接指定标头,更改User-Agent。

g% u9 G" r6 Y% V3 g9 ^

$ curl -H User-Agent: php/1.0 https://google.com ' R |8 G( p$ F% l, a1 ]7 A; m -b-b参数用来向服务器发送 Cookie$ curl -b foo=bar https://google.com & ^7 H1 {$ n# }+ ], u$ }

3 X* u# ]) x3 H( h6 _! X0 j& j

上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie$ curl -b foo1=bar;foo2=bar2 https://google.com 3 h3 l) p$ R: w' s

8 \ Y) |+ H8 X0 l

上面命令发送两个 Cookie$ curl -b cookies.txt https://www.google.com : k7 f* |. c) c8 w* } 上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。

2 @( y& M, s* P3 t6 r5 s; S% ]8 x

-c-c参数将服务器设置的 Cookie 写入一个文件$ curl -c cookies.txt https://www.google.com2 {1 \7 Z9 y" M, J: Y 上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。

+ h% j3 h$ i5 A: _! o1 u# q) s) u

-d-d参数用于发送 POST 请求的数据体$ curl -dlogin=emma&password=123-X POST https://google.com/login! h% D9 b4 S" X J5 z, o& [6 Z # 或者# ~! H6 R% E0 q9 i $ curl -d login=emma -d password=123 -X POST https://google.com/login . G. M% j* U1 A% H

4 y Y; M9 f) W. U- c

使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded并且会自动将请求转为 POST 方法,因此可以省略-X POST。

* _; S# {) U: i' B' O6 J8 j0 c8 O6 J

-d参数可以读取本地文本文件的数据,向服务器发送$ curl -d @data.txt https://google.com/login4 o9 X, F7 ?$ S" x c1 r4 v# f. ~, { 上面命令读取data.txt文件的内容,作为数据体向服务器发送--data-urlencode

; g% ~ _, R3 \* X

--data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码$ curl --data-urlencode comment=hello world https://google.com/login; x7 r% v* { I! O% b

2 A- a6 @0 m. w. \7 r

上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码-e-e参数用来设置 HTTP 的标头Referer,表示请求的来源$ curl -e https://google.com?q=example https://www.example.com% c3 }+ g1 S. l$ f

7 A0 k3 I5 i T

上面命令将Referer标头设为https://google.com?q=example-H参数可以通过直接添加标头Referer,达到同样效果curl -H Referer: https://google.com?q=example https://www.example.com3 {* ]6 {- B7 E4 x2 B

5 w* a, a7 G6 F/ F0 h& u

-F-F参数用来向服务器上传二进制文件$ curl -F file=@photo.png https://google.com/profile 6 v. V1 Y, s0 l9 M( ^% h 上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。

6 S; Y5 P$ ^3 q- G# w

-F参数可以指定 MIME 类型$ curl -F file=@photo.png;type=image/png https://google.com/profile 4 f ]& H' ?1 [; L) B$ ~. f 上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。

h4 Y! |, \' c- T, s7 e

-F参数也可以指定文件名$ curl -F file=@photo.png;filename=me.png https://google.com/profile 5 G2 o2 z$ O" G 上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。

4 y& V3 k8 l' N* O+ s8 M" h" H

-G-G参数用来构造 URL 的查询字符串$ curl -G -d q=kitties -d count=20 https://google.com/search4 f' z& o0 K2 o9 [ 上面命令会发出一个 GET 请求,实际请求的 URL 为。

2 { |" Q. M8 c: ?( t

https://google.com/search?q=kitties&count=20如果省略--G,会发出一个 POST 请求如果数据需要 URL 编码,可以结合--data--urlencode参数。

. C7 H2 k! ?/ ^ s9 }7 A+ c

$ curl -G --data-urlencode comment=hello world https://www.example.com2 A$ x2 H o) Q -H-H参数添加 HTTP 请求的标头$ curl -H Accept-Language: en-US https://google.com ( g6 I. ?( Q* z

. Y$ \( x s! e! c7 N+ x' {* r

上面命令添加 HTTP 标头Accept-Language: en-US$ curl -H Accept-Language: en-US -H Secret-Message: xyzzy https://google.com 5 e. d$ M7 C7 L. n% Q

3 {0 C- n a( B, |

上面命令添加两个 HTTP 标头$ curl -d {"login": "emma", "pass": "123"} -H Content-Type: application/json https://google.com/login0 B+ `8 L) k1 K1 z6 Y" u: f. a

, S2 F- s! o; z) t) [

上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据-i-i参数打印出服务器回应的 HTTP 标头$ curl -i https://www.example.com * v$ ~3 ~, b( Y" p; R

; E( _, S4 d) G1 ^

上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码-I-I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来$ curl -I https://www.example.com 5 O# k' P; U; }# j6 G

( T: ?3 }/ G! ?. N6 z

上面命令输出服务器对 HEAD 请求的回应--head参数等同于-I$ curl --head https://www.example.com % p& C) \8 S3 M* T! D -k-k参数指定跳过 SSL 检测$ curl -k https://www.example.com4 g7 ]# Q8 ]6 z# p; @& ]

2 J/ P( ?3 {6 c) f, L- t! H9 r

上面命令不会检查服务器的 SSL 证书是否正确-L-L参数会让 HTTP 请求跟随服务器的重定向curl 默认不跟随重定向$ curl -L -d tweet=hi https://api.twitter.com/tweet, v' K8 [7 O& O0 g( h Q* F9 z2 j; M9 F

; h+ H+ }6 ?2 x7 B. F4 Z* Q

--limit-rate--limit-rate用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境$ curl --limit-rate 200k https://google.com 1 z! A' I. L! B 上面命令将带宽限制在每秒 200K 字节。

' N1 W/ t! k3 ^4 ?8 w

-o-o参数将服务器的回应保存成文件,等同于wget命令$ curl -o example.html https://www.example.com9 l" [% p0 N# E( _5 u! U8 U 上面命令将http://www.example.com保存成example.html。

0 S& Y7 B! v' a0 \( @0 S% M5 V

-O-O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名$ curl -O https://www.example.com/foo/bar.html9 G0 o0 v' T' e5 M: D* K" T7 g4 C; Q 上面命令将服务器回应保存成文件,文件名为bar.html。

/ h& L. b3 C! n! v. ~* G

-s-s参数将不输出错误和进度信息$ curl -s https://www.example.com ) t9 {8 O! C; G 上面命令一旦发生错误,不会显示错误信息不发生错误的话,会正常显示运行结果如果想让 curl 不产生任何输出,可以使用下面的命令。

! X6 \; E0 s0 `) h) `

$ curl -s -o /dev/null https://google.com 0 z) W! k& {! P -S-S参数指定只输出错误信息,通常与-s一起使用$ curl -S -s -o /dev/null https://google.com7 i3 e7 D3 h- S6 E, U- }

8 C/ n o) P6 l5 B" v% ~

上面命令没有任何输出,除非发生错误-u-u参数用来设置服务器认证的用户名和密码$ curl -u bob:12345 https://google.com/login - i1 \* |9 v' |' \2 d; {" U1 a9 Y 上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1。

+ U2 u; D" b# y9 \, K

curl 能够识别 URL 里面的用户名和密码$ curl https://bob:12345@google.com/login1 ^' N2 B: v/ v# A' Y# J 上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。

/ o& g# a7 B1 ?. J% h$ C2 t( H( R. e

$ curl -u bob https://google.com/login. S; E, H* z7 q* _# {" _: o 上面命令只设置了用户名,执行后,curl 会提示用户输入密码-v-v参数输出通信的整个过程,用于调试$ curl -v https://www.example.com 8 W1 m J3 C/ V2 C4 r

# R: r; H e% {2 ?

--trace参数也可以用于调试,还会输出原始的二进制数据$ curl --trace - https://www.example.com! g9 U3 K+ `" P" m b -x-x参数指定 HTTP 请求的代理$ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com 6 I+ U7 u! r% v6 G8 h, F" c# M

" u" E" [* t; ~

上面命令指定 HTTP 请求通过http://myproxy.com:8080的 socks5 代理发出如果没有指定代理协议,默认为 HTTP$ curl -x james:cats@myproxy.com:8080 https://www.example.com $ e p1 |, q: [4 R6 R9 W# _9 i

; P8 z! @8 g2 S

上面命令中,请求的代理使用 HTTP 协议-X-X参数指定 HTTP 请求的方法$ curl -X POST https://www.example.com # x- _# E8 f8 \: l 上面命令对https://www.example.com发出 POST 请求。

0 U5 c( Y: r$ D2 w! {& r

原文链接:http://www.ruanyifeng.com/blog/2019/09/curl-reference.html 作者: 阮一峰

* C2 d& w2 `3 j0 |4 O1 p$ v4 q+ g8 p ( o1 S; s; R) u8 }$ g- M % \" `( u. z& ^ 8 v: S* r. A- Z9 k" j
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-4-4 08:17 , Processed in 0.074237 second(s), 22 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表