curl使用
本文介绍curl工具的常见用法,使用 https://httpbin.org/ 这个网站作为 Http Server 进行测试
常见用法
-X:指定HTTP请求方法
最简单的GET请求
[root@localhost ~]# curl https://httpbin.org/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.61.1",
"X-Amzn-Trace-Id": "Root=1-697b7bb9-72d9720837c940ea3b545d06"
},
"origin": "223.104.83.109",
"url": "https://httpbin.org/get"
}
不同的请求方式,使用 -X 指定请求方法即可
# POST请求
curl -X POST https://httpbin.org/post
# PUT请求
curl -X PUT https://httpbin.org/put
# DELETE请求
curl -X DELETE https://httpbin.org/delete
-H (Header):设置请求头
设置请求头
curl -H "X-My-Header: CoolValue" https://httpbin.org/headers
-d (Data):设置请求体,--data
# 提交用户名和密码(普通表单格式)
curl -d "username=admin&password=123" https://example.com/login
# 提交 JSON 数据(通常需要配合 -H)
curl -H "Content-Type: application/json" \
-d '{"id": 101, "name": "Gemini"}' \
https://api.example.com/user
发送 -d '{"name": "test"}' 时,服务器并不一定知道这是一段 JSON。如果不加 -H "Content-Type: application/json",服务器可能会把它当成普通文本,导致解析失败。
带参数请求组合
请求即Payloads
# JSON: Content-Type
curl -X POST https://httpbin.org/post \
-H "Content-Type: application/json" \
-d '{"username": "jdoe", "active": true}'
# 表单:application/x-www-form-urlencoded
curl -X POST https://httpbin.org/post \
-d "name=John+Doe" \
-d "[email protected]"
# 上传文件: multipart/form-data
curl -X POST https://httpbin.org/post -F "[email protected]"
# body比较大,不方便加在命令行,将POST body放进文件里读取
curl -X POST https://httpbin.org/post \
-H "Content-Type: application/json" \
-d @data.json
设置Cookies
curl -b "session_id=12345; preference=dark_mode" https://httpbin.org/cookies
# 访问接口,并将Cookies保存到文件
curl -c cookies.txt https://httpbin.org/cookies/set/mycookie/value
# 将Cookies保存到文件进行读取
curl -b cookies.txt https://httpbin.org/cookies
重定向检测
先简单介绍下HTTP 重定向的原理:
平时用浏览器输入一个网址时,很多时候你看到的页面并不是你输入的那个地址,而是经过了一次或多次后台换站。当访问一个网址A时,服务器可能会返回一个 301(永久移动)或 302(临时移动)的状态码,并告诉浏览器:“你要找的东西不在我这,去 URL B 看看吧。”
HTTP 302/303 的 MDN 解释:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/302
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/303
如果不加 -L: curl 收到服务器发的跳转指令(301/302)后,会直接停下来,给你看一段提示信息(甚至什么都不显示),它不会自动去访问 URL B。如果加上 -L: curl 就会像浏览器一样“聪明”。它看到跳转指令后,会自动抓取 URL B 的内容。如果 B 又跳到了 C,它会一直追下去,直到抓取到最终那个能正常显示的页面内容(状态码 200 OK)。
举个直观的例子:访问百度
在 Google 浏览器输入 baidu.com。服务器会反馈:“为了安全,请去 https://www.baidu.com (注意多了 s 和 www )。”,在浏览器中会自动跳转:你根本感觉不到,地址栏会自动变长,页面随后加载出来。实际测试的时候,你可能看到浏览器地址栏还是baidu.com ,选中地址栏的文本时也还是baidu.com ,但是把它复制出来就变成了 https://www.baidu.com/ 。(不同浏览器测试上述行为可能不一样,在google 中测试建议先删掉 baidu 这个搜索引擎,否则回车时使用的地址可能是搜索引擎设置的关键词匹配后的地址,干扰测试)
现在来用curl测试,命令 curl http://baidu.com 结果如下
[root@localhost ~]# curl http://baidu.com
<a href="http://www.baidu.com/">Moved Permanently</a>.
在命令行用 curl -L http://baidu.com: 它会先发现搬家了,然后自动跑去新家,把最终的搜索页面代码抓取回来显示给你。
[root@localhost ~]# curl -L http://baidu.com
# 结果是一段html文本
保存到 html 中打开就是百度的搜索页面

curl 的重定向相关用法
- 自动跟随重定向 (-L)
让 curl 像浏览器一样,发现页面跳转就自动跟过去,直到抓取到最后的网页内容,使用 -L(或 --location)参数。 - 查看重定向的详细过程 (-v 或 -I,大写 i)
可以知道请求是如何从 A 跳到 B,再跳到 C 的,可以结合使用以下参数:
-I (大写 i): 仅查看 HTTP 响应头(Header),不下载网页内容。这能让你看到 Location 字段。
-v (verbose): 显示完整的请求和响应过程(包括握手信息)。
例如:只看重定向的路径和状态码:curl -IL http://baidu.com
[root@localhost ~]# curl -IL http://baidu.com
HTTP/1.1 301 Moved Permanently
Location: http://www.baidu.com/
Date: Sun, 01 Feb 2026 04:47:34 GMT
Content-Type: text/plain; charset=utf-8
HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 0
Content-Type: text/html
Pragma: no-cache
Server: bfe
Date: Sun, 01 Feb 2026 04:47:34 GMT
Windows 下的 curl
Windows 下PowerShell中的curl实际调用的是Invoke-WebRequest
https://stackoverflow.com/questions/47364244/curl-vs-invoke-webrequest

浙公网安备 33010602011771号