◆

Linux curl 命令用法详解

2023-02-15 05:000

什么是 curl 命令

curl 是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面

它的价值在于把 HTTP 请求变成了可以随意组合的命令。前端调接口时用它验证「后端到底返回了什么」——绕过浏览器的缓存、CORS 检查、各种 SDK 封装,直接看原始响应。排查线上问题时更有用,服务器上没有浏览器,curl 是唯一的手段。

输出走 stdout 这一点很关键,意味着它能和其他命令用管道串起来。curl api.com | jq '.data' 提取 JSON 字段,curl url > file 存成文件,写进脚本里做健康检查、批量拉数据都靠这个特性。

示例

查看网页源码

不带任何参数时,curl 发一个 GET 请求,把响应体原样打印出来。注意它不执行 JavaScript,所以拿到的是服务端返回的原始 HTML,SPA 页面看到的会是一个空壳——这也是判断某个页面是服务端渲染还是客户端渲染的快速办法:

curl www.sina.com

显示头信息 -i

-i 在响应体前面加上响应头。看状态码、Content-Type、缓存策略、Set-Cookie 都靠它。只想看头不要body用 -I(大写),它发的是 HEAD 请求,服务器只回头不回体,对付大文件时省流量:

curl -i www.sina.com

发送表单信息

# get
curl example.com/form.cgi?data=xxx
# post
curl -X POST --data "data=xxx" example.com/form.cgi

GET 就是把参数拼在 URL 上。URL 里带 & 的话记得用引号包起来,否则 & 会被 shell 当成后台执行的符号,命令直接断在那儿。

POST 用 --data(简写 -d)。有个细节:只要用了 -d,curl 会自动改成 POST 方法,所以 -X POST 其实可以省略。-d 默认的 Content-Type 是 application/x-www-form-urlencoded,也就是表单格式。

发 JSON 要显式指定类型,不然后端按表单解析会拿到空的 body:

curl -X POST -H "Content-Type: application/json" \
     -d '{"name":"test","age":18}' \
     http://api.example.com/users

JSON 数据用单引号包住,里面的双引号就不用转义了。数据长的话用 -d @file.json 从文件读。

显示详细的信息

-v(verbose)打印完整的交互过程。输出里的前缀有含义:> 是发出的请求,< 是收到的响应,* 是 curl 自己的说明(DNS 解析、TCP 连接、TLS 握手细节)。排查 HTTPS 证书问题、看是不是被重定向、确认请求头到底发了什么,全靠这个:

curl -v www.sina.com

几个高频参数

日常用得最多的其实是下面这几个组合。

-L 跟随重定向。curl 默认不跟302,只会打印一个空 body 加重定向响应头,看着像请求失败。访问会跳转的地址基本都要加 -L。

-o 保存到指定文件,-O 用远端的文件名保存。下载文件时用,配合 -C - 还能断点续传。

-s 静默模式,不打印进度条和错误信息。写脚本时必加,否则进度条会混进输出污染管道。常见组合是 -fsSL:-f 请求失败时返回非零退出码(默认 curl 收到 404 也算成功退出),-s 静默,-S 但仍然显示错误,-L 跟随重定向。安装脚本里那句 curl -fsSL <url> | sh 就是这个组合。

-H 加请求头,可以重复多次。带 token 的接口用 -H "Authorization: Bearer xxx"。

--connect-timeout 和 --max-time 设超时。前者只管建立连接的时间,后者管整个请求的总时长。脚本里一定要设,否则遇到没响应的服务会一直挂着。

-w 自定义输出格式,测接口耗时很方便:

curl -o /dev/null -s -w "状态码:%{http_code} 总耗时:%{time_total}s\n" https://example.com

把响应体丢进 /dev/null,只关心状态码和耗时,用来做简单的性能观察比开浏览器 DevTools 快。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVELinux curl 命令用法详解加载中