CURL的使用详解
发起GET请求
-
命令后直接跟地址
curl 'https://www.baidu.com'
-
请求中拼接查询参数
curl -G -d 'key=value' 'https://www.baidu.com'
这里就等于在浏览器地址栏里访问
https://www.baidu.com?key=value
如果需要对value进行url编码,那么可以这样写:
curl -G --data-urlencode 'key=value' 'https://www.baidu.com'
注意,如果没有-G参数的话,会发起一个
POST
请求,-d
指定的参数会被使用form
表单的形式提交 -
保存响应信息到一个指定文件
curl -o response.txt 'https://www.baidu.com'
-
请求中增加header
curl 'https://www.baidu.com/' \ -H 'Host: www.baidu.com' \ -H 'Accept-Language: zh-cn' \ -H 'Referer: https://www.baidu.com/'
发起POST请求
-
发起一个最简单的POST请求
curl -X POST 'https://www.baidu.com'
-
使用form表单的形式提交数据
curl -d 'username=123&password=123' -X POST 'https://www.baidu.com'
-d
后面的内容就是request body增加了
-d
这个参数,会默认的设置 headerContent-Type
为application/x-www-form-urlencoded
甚至在设置了
-d
以后,-X POST
这个参数也可以省略掉,请求方式默认会使用POST
方式curl -d 'username=123&password=123' 'https://www.baidu.com'
-
form表单数据拆开,更易阅读
curl 'https://www.baidu.com' \ -d 'username=123' \ -d 'password=123'
多个参数的时候,可以每个参数用一个单独的
-d
来指定 -
使用JSON格式提交数据
curl 'https://www.baidu.com' \ -H 'Content-Type: application/json' \ -d '{"username": "123", "password": "123"}'
-H
: 首先使用-H
指定提交的数据为json格式-d
: 是指定提交的内容,这里是一个json格式的字符串 -
从文件中加载提交数据
curl -d '@data.txt' 'https://www.baidu.com'
-d
参数中使用@
符号来指定一个文件名,告诉curl加载这个文件的内容来作为请求的数据。 -
对提交的数据进行URL编码
上面讲到的
-d
参数是不会对请求的数据做任何处理的,但是有的时候我们可能会提交一些待特殊字符的参数,例如网址、空格、问号等等,这个时候就需要对请求数据进行url编码,curl已经提供了先编码再提交的功能,只需要吧-d
替换为--data-urlencode
。--data-urlencode
的其他用法与-d
完全一样。curl 'https://www.baidu.com' \ --data-urlencode 'username=123' \ --data-urlencode 'password=123'
-
上传文件
curl -F 'file=@image.png' 'https://www.baidu.com'
-F
:利用这个参数指定要上传的文件,同时参数还会自动的设置header中的Content-Type
为multipart/form-data
-
上传文件的同时指定MIME类型
curl -F 'file=@image.png;type=image/png' 'https://www.baidu.com'
-
上传文件,修改上传文件的文件名
curl -F 'file=@image.png;filename=otherName.png' 'https://www.baidu.com'
cookies自动保存与发送
curl -c cookies.txt 'https://www.baidu.com' \
--data-urlencode 'username=123' \
--data-urlencode 'password=123'
curl -b cookies.txt 'https://www.baidu.com'
-c
会自动的把cookies
保存到 cookies.txt
文件中
-b
会自动的把cookies.txt
中的内容当做cookies
放到请求中
User Agent修改
-
利用 -A 参数修改
使用
-A
参数可以直接修改 User-Agent#模拟Firefox curl 'https://www.baidu.com' \ -A 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0' #模拟Chrome curl 'https://www.baidu.com' \ -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' #模拟Safari curl 'https://www.baidu.com' \ -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15'
-
通过 -H 修改
curl 'https://www.baidu.com' \ -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15'
修改 Referrer
修改Referrer也有两种方法,一种是通过-e
直接修改,另一种是通过 -H
在header中修改
curl 'https://www.baidu.com' \
-e 'https://www.baidu.com'
curl 'https://www.baidu.com' \
-H 'Referer: https://www.baidu.com'
响应重定向
默认情况下curl不响应重定向,也就是在响应码为 3XX 的时候不会执行重定向,需要指定-L
参数才会响应。
curl -L 'https://www.baidu.com'
静默模式
curl -s 'https://www.baidu.com'
-s
会隐藏掉错误信息和进度条,但是会打印响应信息。
如果也想把响应信息省略掉,那么可以使用下面的命令
curl -s -o /dev/null 'https://www.baidu.com'
-o /dev/null
会丢弃响应body
如果想静默模式的情况下,打印请求出现的错误,可以使用下面的命令
curl -S -s -o /dev/null 'https://www.baidu.com'
在-S
和 -s
一起用的时候,仍然会隐藏进度条,但是当请求错误的时候,会打印错误信息。
限速
#限制访问速度为1k
curl --limit-rate 1k 'https://www.baidu.com'
#限制访问速度为1byte
curl --limit-rate 1 'https://www.baidu.com'
打印请求Headers
curl -v -s -o /dev/null --stderr - 'https://www.baidu.com' | grep '^>'
-v
会打印出详细的调试信息, -o /dev/null
把响应body丢弃
--stderr -
把标准的错误输出转发到标准输出,这样就可以使用grep
命令来做筛选了。
筛选出>开头的行,就是请求Headers
只打印响应码
curl -w '%{response_code}' -s -o /dev/null 'https://www.baidu.com'
不验证ssl证书
curl -k 'https://www.baidu.com'
打印响应Headers
-
只用
-i
这样会既打印Header信息又打印Body信息curl -i https://www.baidu.com
-
只打印Header信息
curl -s -o /dev/null -D - https://www.baidu.com
-s
:作用是不展示进度条-o /dev/null
:作用是把输出的body丢弃-D -
:作用是把headers信息转存到一个文件中,这里的-
代表标准输出下面这个命令看似也是只打印了header
curl -I https://www.baidu.com
但是实际这个命令是发送的
HEAD
请求,而不是GET
或者POST
,从返回的头信息上也可以看出来。下面的返回长度有 2443,上面的返回长度只有277。
另外,如果是一些resful风格接口,只支持
GET
或者POST
,这时候使用-I
的时候就会报404错误