curl命令学习笔记一

一.curl命令使用场景

场景一

arduino 复制代码
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash

curl -fsSL(下载工具及参数)

curl 是一个发出网络请求的命令行工具。这里的四个参数各有用途:

  • -f (--fail) :如果服务器返回 HTTP 错误码(如 404 Not Found 或 500 内部错误),curl 会直接退出而不输出错误页面内容。这防止了错误页面被当成脚本代码传给 bash 执行。
  • -s (--silent) :静默模式。不显示下载进度条和统计数据,让输出更"干净"。
  • -S (--show-error) :与 -s 配合使用。虽然静默了进度,但如果真的发生网络错误,依然会显示错误信息(否则错误也会被静默掉)。
  • -L (--location) :跟随重定向。如果服务器返回 301/302 跳转指令,curl 会自动请求新的目标地址。
  • | bash (管道与执行):将 curl 命令的标准输出 (即下载下来的脚本内容)直接传递给右侧命令的标准输入,调用当前系统中的 Bash 解释器,逐条执行.

二.crul 常用命令

curl 命令学习指南

服务器地址: http://192.168.242.128:8000 所有测试接口前缀: /test/


速记表

参数 作用 示例
-X 指定 HTTP 方法 -X POST
-d 请求体数据 -d '{"a":1}'
-H 添加请求头 -H "Content-Type: application/json"
-F 表单/文件上传 -F "file=@./a.txt"
-b 发送 Cookie -b "key=value"
-c 保存 Cookie 到文件 -c cookies.txt
-v 详细输出(调试必用) -v
-i 显示响应头 -i
-L 跟随重定向 -L
-I 只看响应头(HEAD 请求) -I
-o 保存响应体到文件 -o output.png
-w 格式化输出变量 -w "%{http_code}"
-s 静默模式 -sS
--max-time 总超时秒数 --max-time 5
--connect-timeout 连接超时秒数 --connect-timeout 3

1. 基础 HTTP 方法

bash 复制代码
curl http://192.168.242.128:8000/test/method

最简单的 GET 请求curl 默认就是 GET 方法,所以不需要加 -X。浏览器在地址栏输入 URL 本质上也是发 GET 请求。

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/method

-X 指定 HTTP 方法。POST 通常用于"创建/提交"数据。这里演示的是同一个 URL 对不同方法返回不同结果。

bash 复制代码
curl -X PUT http://192.168.242.128:8000/test/method

PUT 通常用于"全量替换"资源。比如更新用户全部信息,会把所有字段都覆盖掉。

bash 复制代码
curl -X PATCH http://192.168.242.128:8000/test/method

PATCH 通常用于"局部更新"。比如只改用户手机号,其他字段不动。比 PUT 更轻量。

bash 复制代码
curl -X DELETE http://192.168.242.128:8000/test/method

DELETE 删除资源。语义明确,一看就知道要删东西。

2. 详细输出控制

bash 复制代码
curl -v http://192.168.242.128:8000/test/method

-v(verbose)显示完整的请求头和响应头> 开头的行是 curl 发出去的,< 开头的行是服务器返回的。调试必用。

bash 复制代码
curl -i http://192.168.242.128:8000/test/method

-i(include)在响应体前面带上响应头 。和 -v 的区别:-i 不显示请求头、不显示 TLS 握手信息,输出更干净。

bash 复制代码
curl -sS http://192.168.242.128:8000/test/method

-s(silent)静默模式,不显示进度条;-S(show-error)配合 -s 时仍然显示错误信息。适合写在脚本里

bash 复制代码
curl -w '\n耗时: %{time_total}s\n' http://192.168.242.128:8000/test/echo

-w(write-out)输出格式化变量%{time_total} 是总耗时,还有其他如 %{http_code}(状态码)、%{size_download}(下载字节数)等。\n 是换行。


3. 路径参数

bash 复制代码
curl http://192.168.242.128:8000/test/path/42

URL 路径中的 42 被服务端提取为参数。RESTful API 的典型风格/user/42 表示 id 为 42 的用户。

bash 复制代码
curl http://192.168.242.128:8000/test/path/books/99

多个路径参数books 是分类,99 是 id。层级关系一目了然。

bash 复制代码
curl http://192.168.242.128:8000/test/path/optional/a/b/c/d

通配路径/a/b/c/d 整段被捕获为一个字符串。常用于文件路径、嵌套资源等场景。

4. 查询参数(Query String)

bash 复制代码
curl "http://192.168.242.128:8000/test/query?name=Tom&age=25&page=2&size=5"

? 后面是查询参数,key=value 格式,多个用 & 连接。必须加引号 ,否则 & 会被 shell 解释为后台运行。

bash 复制代码
curl "http://192.168.242.128:8000/test/query?tags=a&tags=b&tags=c"

同名参数传多次 = 数组 。服务端收到 tags=["a","b","c"]。这是 HTTP 协议传数组的标准方式。


5. JSON 请求体

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/body/json -H "Content-Type: application/json" -d '{"name":"张三","age":30,"city":"北京"}'

拆解:

  • -X POST:指定 POST 方法
  • -H "Content-Type: application/json"告诉服务端"我发的是 JSON",服务端据此解析
  • -d '{"name":"张三"...}'-d 是请求体数据。单引号保护 JSON 内部的双引号不被 shell 解释
bash 复制代码
curl -X POST http://192.168.242.128:8000/test/body/typed -H "Content-Type: application/json" -d '{"name":"Tom","age":25,"tags":["dev","ops"]}'

和上一个类似,但数据中有嵌套数组 ["dev","ops"],服务端会做强类型校验(name 必须是字符串、age 必须是数字)。

6. 表单提交

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/body/form -d 'username=admin&password=123456&remember=true'

注意没有 -H "Content-Type" 。curl 不给 -d 加 Content-Type 时,它会把 Content-Type 自动设为 application/x-www-form-urlencoded,这就是普通 HTML 表单的提交方式。key=value&key=value 的格式。

7. 文件上传

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/upload -F "file=@./test.txt" -F "description=一段说明"

拆解:

  • -F(form)模拟 HTML 表单的文件上传 ,Content-Type 自动设为 multipart/form-data
  • file=@./test.txt@ 表示读取本地文件内容 发送,没有 @ 就是普通字符串
  • 一个 -F 就是一个表单字段,可以有多个
bash 复制代码
curl -X POST http://192.168.242.128:8000/test/upload/multi -F "files=@./a.txt" -F "files=@./b.txt"

同一字段名传多个文件,服务端收到一个文件数组。和查询参数的数组逻辑一样。

8. 请求头

bash 复制代码
curl http://192.168.242.128:8000/test/headers

不加任何自定义头,看 curl 默认发了什么 。你会看到 User-Agent: curl/x.x.xAccept: */* 等 curl 自带的信息。

bash 复制代码
curl http://192.168.242.128:8000/test/headers/user-agent -H "User-Agent: MyCurlApp/1.0"

-H(header)添加自定义请求头。这里伪装成自己的 App 名称。服务器可以据此识别客户端类型。

bash 复制代码
curl http://192.168.242.128:8000/test/headers/custom -H "X-Custom-Token: secret123"

自定义头通常以 X- 开头(历史惯例),用于传递 Token、追踪 ID 等自定义信息。

bash 复制代码
curl http://192.168.242.128:8000/test/headers/auth -H "Authorization: Bearer eyJhbGciOi..."

Authorization 是 HTTP 标准的认证头Bearer 是令牌类型(最常见的是 JWT),eyJ... 是 Base64 编码的令牌内容。几乎所有需要登录的 API 都用这个头传递身份信息。


bash 复制代码
curl http://192.168.242.128:8000/test/cookies -b "session=abc123; uid=42"

-b(cookie)发送 Cookie 给服务器 。格式是 name=value; name=value。服务端收到后可以用来识别用户、维持会话。

bash 复制代码
curl http://192.168.242.128:8000/test/cookies/set -c cookies.txt

-c(cookie-jar)把服务器返回的 Set-Cookie 保存到本地文件 cookies.txt 。下次请求用 -b cookies.txt 就能带上这些 Cookie,实现类似浏览器的"记住登录状态"。

10. 状态码

bash 复制代码
curl -o NUL -w "%{http_code}\n" http://192.168.242.128:8000/test/status/200

拆解:

  • -o NUL:把响应体丢进垃圾桶(Windows 是 NUL,Linux/Mac 是 /dev/null),只关心状态码
  • -w "%{http_code}\n":输出 HTTP 状态码 + 换行
  • 200 = 成功
bash 复制代码
curl -o NUL -w "%{http_code}\n" http://192.168.242.128:8000/test/status/301

301 = 永久重定向(资源已永久迁移到新地址,浏览器会记住)

bash 复制代码
curl -o NUL -w "%{http_code}\n" http://192.168.242.128:8000/test/status/404

404 = 未找到(客户端输错了 URL 或资源不存在)

bash 复制代码
curl -o NUL -w "%{http_code}\n" http://192.168.242.128:8000/test/status/500

500 = 服务器内部错误 (代码崩了、数据库挂了等)。4xx 是客户端的错,5xx 是服务端的错

11. 重定向

bash 复制代码
curl -L http://192.168.242.128:8000/test/redirect?target=/test/method

-L(Location)自动跟随重定向 。服务端返回 302 + Location: /test/method,curl 会自动向新地址再发一次请求。不加 -L 只会看到 302 状态码,不会跳转

bash 复制代码
curl -L -v http://192.168.242.128:8000/test/redirect?target=/test/method

-L -v 配合,可以看到两次请求的全过程:第一次返回 302,第二次拿到最终结果。

bash 复制代码
curl -I http://192.168.242.128:8000/test/redirect

-I(head)只发 HEAD 请求,只拿响应头 。可以检查重定向目标而不下载响应体。等同于 curl --head


12. 超时测试

bash 复制代码
curl --max-time 2 http://192.168.242.128:8000/test/slow/5

--max-time 2整个请求最多等 2 秒 ,超时就断开。服务端要 5 秒才响应 → curl 报错退出。用于测试服务端响应速度、设置调用方超时保护

bash 复制代码
curl --connect-timeout 1 http://192.168.242.128:8000/test/slow/1

--connect-timeout 1只限制 TCP 连接阶段的超时 (1 秒内连不上就放弃)。连接建立后的传输时间不受此限制。--max-time 是总计时,--connect-timeout 只管连接。


13. 不同响应格式

bash 复制代码
curl http://192.168.242.128:8000/test/format/html

返回 HTML 页面 。Content-Type 是 text/html。浏览器渲染的就是这种。curl 虽然不渲染,但能看到完整 HTML 结构。

bash 复制代码
curl http://192.168.242.128:8000/test/format/text

返回纯文本 ,Content-Type 是 text/plain。最简单的响应格式,不含任何标记。

bash 复制代码
curl http://192.168.242.128:8000/test/format/binary -o out.png

-o out.png把响应体保存为文件 out.png ,不做终端输出。二进制数据直接输出到终端会乱码,所以用 -o 保存。-O(大写)会用远程文件名自动保存。

14. CRUD 完整流程

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/crud/item -H "Content-Type: application/json" -d '{"name":"苹果","price":5.5}'

C = Create(创建):POST + JSON 请求体 → 服务端存入内存字典,返回带 id 的对象。

bash 复制代码
curl "http://192.168.242.128:8000/test/crud/items?page=1&size=5"

R = Read(列表读取):GET + 分页参数 → 返回第 1 页,每页最多 5 条。

bash 复制代码
curl http://192.168.242.128:8000/test/crud/item/1

R = Read(单个读取):用路径参数指定 id=1 → 返回该条详情,不存在则 404。

bash 复制代码
curl -X PUT http://192.168.242.128:8000/test/crud/item/1 -H "Content-Type: application/json" -d '{"name":"香蕉","price":3.0}'

U = Update(全量替换) :PUT 必须传所有字段,服务端会完全覆盖。和 PATCH 的区别在这里体会最明显。

bash 复制代码
curl -X PATCH http://192.168.242.128:8000/test/crud/item/1 -H "Content-Type: application/json" -d '{"price":9.9}'

U = Update(局部修改) :PATCH 只传要改的字段 。这里只改 pricename 保持原值。RESTful 最佳实践。

bash 复制代码
curl -X DELETE http://192.168.242.128:8000/test/crud/item/1

D = Delete(删除):删除 id=1 的资源。真正的删除操作需要鉴权,这里只是演示语义。

15. 万能 Echo(强烈推荐第一个试这个)

bash 复制代码
curl -X POST "http://192.168.242.128:8000/test/echo?foo=bar" -H "X-Custom: hello" -b "session=test" -d '{"msg":"hello world"}'

学习 curl 最实用的接口。一条命令同时用到了:

  • -X POST(指定方法)
  • ?foo=bar(查询参数)
  • -H "X-Custom: hello"(自定义头)
  • -b "session=test"(Cookie)
  • -d '{"msg":"hello world"}'(JSON 请求体)

服务端把所有信息原样返回,你就能看到 curl 实际发了什么

16. 请求体大小探测

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/body/size -H "Content-Type: application/json" -d '{"data":"hello"}'

服务端会告诉你请求体有多少字节。试着把 -d 的数据改大改小,观察字节数变化。

17. 查看所有测试接口

bash 复制代码
curl http://192.168.242.128:8000/test

测试接口的目录页 ,列出 /test 下所有可用接口及其方法。忘记有哪些接口时先打这个。


常见 HTTP 状态码一览

状态码 含义 类型
200 成功 2xx 成功
201 已创建 2xx 成功
204 无内容(删除成功常用) 2xx 成功
301 永久重定向 3xx 重定向
302 临时重定向 3xx 重定向
400 请求错误(参数不对) 4xx 客户端错误
401 未认证(没登录) 4xx 客户端错误
403 禁止访问(没权限) 4xx 客户端错误
404 未找到 4xx 客户端错误
429 请求太频繁 4xx 客户端错误
500 服务器内部错误 5xx 服务端错误
502 网关错误 5xx 服务端错误
503 服务不可用 5xx 服务端错误
相关推荐
用户41659673693551 小时前
Android WebView 加载 file:// 离线页面调试教程
android·前端
我是一只快乐的小螃蟹1 小时前
1.2 ArrayList 源码解析
前端
星栈1 小时前
我用 Rust + Dioxus 做了个全栈跨平台笔记应用:再把新建、编辑和交付补上
前端·rust·前端框架
我是一只快乐的小螃蟹1 小时前
1.1 HashMap (JDK1.8) 源码解析
前端
爱勇宝4 小时前
小红花成长新版:模板来了,鼓励也更容易开始
前端·后端·程序员
竹林8184 小时前
Solana前端开发:我在一个NFT铸造页面上被@solana/web3.js的Connection和Transaction签名坑了两天
前端
冬奇Lab5 小时前
每日一个开源项目(第144篇):ai-website-cloner-template - 一条命令、多 Agent 并行,把任意网站逆向成 Next.js 代码
前端·人工智能·开源
玄玄子5 小时前
webpack publicPath作用原理
前端·webpack·程序员
HduSy5 小时前
帮 Claude Code 做了个菜单栏 Token 看板,聊聊里面的一些实现逻辑
前端