-- TOC --
curl是一个著名的程序,也是一个库,支持的特性非常丰富,在命令行,常用来下载文件或发送各种HTTP请求用于测试。
curl官网:https://curl.se/,有很多可以学习的资料。
-A
参数指定客户端的用户代理标头,即User-Agent。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
-b
参数用来向服务器发送Cookie,
$ curl -b 'foo1=bar;foo2=bar2' https://google.com
$ curl -b cookies.txt https://www.google.com
-c
参数将服务器设置的 Cookie 写入一个文件。
$ curl -c cookies.txt https://www.google.com
上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。
-o
或--output
参数将服务器的回应保存成文件,文件名自定义;
-O
参数将服务器回应保存成文件,并将URL的最后部分当作文件名。
--limit-rate
用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。
使用-i
参数,没有此参数时,会把url指向的页面html抓回来,有此参数时,先显示http header信息。
或者,只用-I
参数,请求HEAD,同--head
:
$ curl -I https://www.pynote.net
HTTP/1.1 200 OK
Date: Tue, 22 Mar 2022 02:08:58 GMT
Server: Apache/2.4.41 (Unix) OpenSSL/1.0.2k-fips PHP/7.3.8
X-Powered-By: PHP/7.3.8
Vary: Accept-Encoding,Cookie
Cache-Control: max-age=3, must-revalidate, max-age=604800
Content-Length: 28530
Last-Modified: Tue, 22 Mar 2022 02:06:19 GMT
Expires: Tue, 29 Mar 2022 02:08:58 GMT
Content-Type: text/html; charset=UTF-8
$ curl <url>
$ curl -X GET <url>
$ curl -v <url>
一个细节:当url中存在query string的时候,需要将整个query string用引号括起来,因为存在&
字符。
With the -v
or --verbose
, curl will output detailed information including the HTTP header information and SSL handshake steps.
$ curl -X POST [options] <url>
-X
选项指定与远程服务器通信时将使用哪种HTTP请求方法。
发送表单数据
curl -X POST -F 'name=Jason' -F 'email=jason@example.com' https://example.com/contact.php
使用该-F
选项时,curl使用Content-Type为multipart/form-data
发送数据。
$ curl -X POST -F 'a=123' -F 'b=456' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:232
CONTENT_TYPE:multipart/form-data; boundary=------------------------788f6dbddca01cb0
REQUEST_BODY:--------------------------788f6dbddca01cb0
Content-Disposition: form-data; name="a"
123
--------------------------788f6dbddca01cb0
Content-Disposition: form-data; name="b"
456
--------------------------788f6dbddca01cb0--
貌似上传文件也是放在表单数据中,文件名前加上@
:
$ cat test.txt
curl test
$ curl -X POST -F 'file=@test.txt' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:196
CONTENT_TYPE:multipart/form-data; boundary=------------------------9bb13378ca822f0a
REQUEST_BODY:--------------------------9bb13378ca822f0a
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
curl test
--------------------------9bb13378ca822f0a--
发送超大文件,或者流媒体呢?
发送单纯的数据
发出POST请求的另一种方法是使用-d
选项,同--data
。这导致curl使用application/x-www-form-urlencoded
作为Content-Type发送数据。
curl -X POST -d 'name=Jason' -d 'email=jason@example.com' https://example.com/contact.php
curl -X POST -d 'name=Jason&email=jason@example.com' https://example.com/contact.php
数据都在REQUEST_BODY里面:
$ curl -X POST -d 'a=123' -d 'b=456' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:11
CONTENT_TYPE:application/x-www-form-urlencoded
REQUEST_BODY:a=123&b=456
-d参数还可以读取本地文本文件的数据,向服务器发送,依然使用@
:
$ curl -d '@data.txt' https://google.com/login
--data-urlencode
参数等同于-d,发送POST 请求的数据体,区别在于会自动将发送的数据进行URL编码:
$ curl --data 'cc=hello curl :)' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:16
CONTENT_TYPE:application/x-www-form-urlencoded
REQUEST_BODY:cc=hello curl :)
$ curl --data-urlencode 'cc=hello curl :)' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:24
CONTENT_TYPE:application/x-www-form-urlencoded
REQUEST_BODY:cc=hello%20curl%20%3A%29
指定CONTENT_TYPE
-H
参数添加 HTTP 请求的标头,因此可以用来指定CONTENT_TYPE.
$ curl -X POST -H "Content-Type: application/json" -d '{"name": "Jason", "email": "jason@example.com"}' http://localhost:8051
REQUEST_METHOD:POST
PATH_INFO:/
QUERY_STRING:
qs:{}
CONTENT_LENGTH:47
CONTENT_TYPE:application/json
REQUEST_BODY:{"name": "Jason", "email": "jason@example.com"}
-L
参数会让HTTP请求跟随服务器的重定向,curl默认不跟随重定向。
-x
参数指定 HTTP 请求的代理,需要指定协议类型 protocol://address:port
You can ignore SSL certificate errors by using the -k
or --insecure
flags which is useful if you have a self-signed certificate.
本文链接:https://cs.pynote.net/sf/linux/shell/202203221/
-- EOF --
-- MORE --