Linux-Curl

简介
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。
它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。
说明
参数的顺序没有固定,可以任意调整
同一个参数可以出现多次,根据需要添加
参数可以任意组合,根据需要组合
参数的大小写敏感,大小写具备不同的含义
GET请求
- 普通get请求
curl https://www.baidu.com
- 带数据的get请求
带一个参数
curl https://www.baidu.com?id=1
带多个参数,用引号括起来,否则&后的参数都无法被解析
curl 'https://www.baidu.com?id=1&name=jack'
- 带请求头的get请求,支持多个
curl 'https://www.baidu.com?id=1&name=jack' -H "token:123" -H "Authorization: Basic QVBJxxxx"
POST请
- 普通post请求,
-X POST
可省略。
curl -X POST https://google.com/login
- 提交表单数据的post请求
curl -d 'login=emma&password=123' -X POST https://google.com/login
或者
curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login
使用-d
参数以后,HTTP 请求会自动加上请求头Content-Type : application/x-www-form-urlencoded
。并且会自动将请求转为 POST 方法,因此也可以省略-X POST
- 提交json格式的post请求
curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
添加HTTP 请求头是Content-Type: application/json
,然后用-d
参数发送 JSON 数据。-X POST
可省略。
- 提交文件的post请求
curl -X POST -F "file=@photo.png" http://example.com/upload
上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data
,然后将文件photo.png
作为file
字段上传。-X POST
可省略
curl 在上传文件时,会根据文件扩展名自动推断并设置 MIME 类型。如果您需要自定义 MIME 类型,可以使用 -H "Content-Type"
选项。正确设置 MIME 类型对于服务器端正确处理上传文件非常重要。
常用参数
- i
-i
参数打印出服务器回应的 HTTP 标头。会输出响应头+响应体
- I
-I
参数向服务器发出 HEAD 请求(只请求页面的首部),然会将服务器返回的 HTTP 标头打印出来。不会输出响应
- L
-L
参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。
- limit-rate
--limit-rate
用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。
curl --limit-rate 200k https://google.com
该命令将宽限制在每秒 200K 字节。
- o
-o
(小写)参数将服务器的回应保存成文件,等同于wget
命令。
curl -o example.html https://www.example.com
该命令将响应保存成example.html
。
- x
-x
(小写)参数指定 HTTP 请求的代理。
- v
curl -v https://www.example.com
输出通信的整个过程,用于调试。
- data-urlencode
--data-urlencode
参数等同于-d
,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。
注意
在使用 curl 命令时,双引号("")和单引号('')在处理字符串方面有细微但重要的区别,这主要涉及到 shell 对特殊字符的解释。
单引号('')
- 强引用: 单引号内的所有字符都按照字面意思处理,包括特殊字符(如 $、`、\ 等)。
- 防止变量替换: 单引号内的变量名不会被替换成其对应的值。
- 适用于:
- 包含特殊字符的字符串,需要防止 shell 进行解释。
- 需要精确控制字符串内容的情况。
示例:
curl 'http://example.com/search?query=hello+world&page=1'
在这个例子中,单引号确保 URL 中的 +
号被正确传递,而不是被 shell 解释为其他含义。
双引号("")
- 弱引用: 双引号内的字符大部分按照字面意思处理,但会对一些特殊字符进行解释,如:
$
: 用于变量替换。- `
\
: 用于转义特殊字符。
- 允许变量替换: 双引号内的变量名会被替换成其对应的值。
- 适用于:
- 包含变量的字符串。
- 需要进行简单的转义的字符串。
示例:
name="world"
curl "http://example.com/search?query=hello+$name&page=1"
在这个例子中,双引号允许变量 name
被替换成它的值 "world"。
小结
- 何时使用单引号:
- URL 中包含特殊字符时。
- 需要精确控制字符串内容时。
- 不希望 shell 对字符串进行任何解释时。
- 何时使用双引号:
- 字符串中包含变量时。
- 需要进行简单的转义时。
示例 | 解释 |
---|---|
curl 'http://example.com/search?query=hello+world' |
URL 中的 + 号被原样传递。 |
curl "http://example.com/search?query=hello+world" |
与单引号效果相同。 |
name="world"; curl "http://example.com/search?query=hello+$name" |
变量 name 被替换为 "world"。 |
curl 'http://example.com/search?query=hello\$name' |
$ 被视为普通字符。 |
curl "http://example.com/search?query=hello\$name" |
$ 被转义,name 不被替换。 |