简介


curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。

它的功能非常强大,命令行参数多达几十种。

curl的基本用法

发送 GET 请求

最简单的用法是向指定的 URL 发送 GET 请求,并在控制台输出返回的内容。

1
curl https://www.example.com

运行上述命令后,curl 会输出 https://www.example.comHTML 页面内容。默认情况下,curl 发送一个 HTTP GET 请求,并输出服务器的响应结果到终端。

1
2
3
4
5
6
7
8
9
10
11
12
<!doctype html>
<html>
<head>
<title>Example Domain</title>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents.</p>
</div>
</body>
</html>

下载文件

使用 curl 可以轻松下载文件,只需要添加 -O 选项即可。

1
curl -O https://example.com/file.zip

该命令将下载 file.zip 文件并保存到当前目录。-O 选项表示将文件保存到本地,并保持原文件名。

指定文件名

如果你想要自定义文件名保存,可以使用 -o 选项。

1
curl -o myfile.zip https://example.com/file.zip

该命令将 file.zip 文件保存到当前目录,并重命名为 myfile.zip

查看 HTTP 头信息

使用 curl 可以仅查看服务器的 HTTP 响应头信息,方法是添加 -I--head 选项。

1
curl -I https://www.example.com

运行该命令后,curl 会返回响应头而不是网页内容。

1
2
3
4
5
6
7
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 648
Connection: keep-alive
Date: Tue, 26 Sep 2024 12:00:00 GMT
Server: ECS (nyb/1D22)
Accept-Ranges: bytes

响应头中可以看到状态码(如 200 OK)、内容类型(Content-Type)、服务器信息等。

发送 POST 请求

curl 默认发送 GET 请求,如果需要发送 POST 请求,则可以使用 -X POST 指定请求方法,并使用 -d 选项传递数据。

1
curl -X POST -d "username=user&password=pass" https://example.com/login

该命令将以 POST 方式向 https://example.com/login 发送数据 username=userpassword=pass,并返回响应内容。

发送 JSON 数据

使用 curl 发送 JSON 数据时,需要指定请求头为 application/json,并通过 -d 传递 JSON 数据。

1
curl -X POST -H "Content-Type: application/json" -d '{"username":"user","password":"pass"}' https://example.com/api/login

该命令将以 POST 方式发送 JSON 数据到指定 API,并返回服务器响应内容。

1
2
3
4
{
"status": "success",
"message": "Login successful"
}

添加请求头

如果需要在请求中添加自定义请求头,可以使用 -H 选项。

1
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/data

该命令将带有 Authorization 请求头,发送一个带有身份认证的 GET 请求,并返回请求的结果。

追踪重定向

有些 URL 会重定向到另一个地址。默认情况下,curl 不会跟随重定向。使用 -L 选项可以让 curl 自动跟随重定向。

1
curl -L www.sina.com

键入上面的命令,结果就自动跳转为www.sina.com.cn。

限制请求速度

如果你想限制请求速度(如每秒下载速率),可以使用 --limit-rate 选项。

1
curl --limit-rate 100K -O https://example.com/largefile.zip

该命令将下载 largefile.zip,并将下载速度限制为 100KB 每秒,适用于网络带宽受限的情况。

curl 支持通过 Cookie 保存和发送会话信息。使用 -c 选项可以保存 Cookie,使用 -b 选项发送 Cookie。

1
2
3
4
5
# 第一次请求,保存 Cookie
curl -c cookies.txt https://example.com/login

# 第二次请求,发送保存的 Cookie
curl -b cookies.txt https://example.com/dashboard

第一个命令会将登录请求的 Cookie 保存到 cookies.txt 文件中,第二个命令会使用这个 Cookie 文件发送请求。

显示请求过程

为了查看 curl 请求的详细过程(如 DNS 解析、连接、重定向等),可以添加 -v 选项。

1
curl -v https://www.example.com

-v 选项将输出 curl 执行请求的详细信息,包含发出的请求、收到的响应头,以及 DNS 查询、连接建立的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
*   Trying 93.184.216.34...
* TCP_NODELAY set
* Connected to www.example.com (93.184.216.34) port 443 (#0)
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.68.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=UTF-8
< Content-Length: 1256
< Server: ECS (nyb/1D22)
< Date: Tue, 26 Sep 2024 12:00:00 GMT
< Connection: keep-alive

忽略 SSL 证书验证

在某些情况下(如测试环境),你可能需要忽略 SSL 证书验证错误。这时可以使用 -k--insecure 选项。

1
curl -k https://insecure-website.com

该命令会忽略 SSL 证书验证,访问 HTTPS 网站。

User Agent字段

这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。

1
curl --user-agent "[User Agent]" [URL]

文件上传

假定文件上传的表单是下面这样:

1
2
3
4
 <form method="POST" enctype='multipart/form-data' action="upload.cgi">
    <input type=file name=upload>
    <input type=submit name=press value="OK">
  </form>

你可以用curl这样上传文件:

1
curl --form upload=@localfilename --form press=OK [URL]

结语

curl 是一个功能丰富的命令行工具,适用于从简单的网页请求到复杂的 API 调试。通过掌握常见的 curl 用法,可以更加高效地进行 Web 开发、测试和调试工作。
参考文章