加强版curl编写
curlv:在浏览器里查看 curl 的响应
curlv是对curl命令的一层小封装:发出网络请求后,不再把响应糊在终端里,而是自动整理好丢进浏览器查看。
一、为什么写这个(历史背景)
用curl在终端里看响应,体验很差,核心问题是展示不清,如果用postman来执行又会操作繁琐:
- JSON 挤成一行:接口返回的 JSON 默认不换行、不缩进,一坨文本糊在终端,想找某个字段得瞪半天。
- HTML 变乱码墙:
curl一个网页,满屏标签源码滚过去,看不出页面长什么样。 - 长内容刷屏:响应一长就把之前的终端记录顶没了。
- 转义字符不还原:中文常显示成
\uXXXX这种转义形式,不直观。
一句话总结:curl擅长「拿数据」,不擅长「给人看」。curlv补的就是"给人看"这一段——把响应交给浏览器,该缩进的缩进,该渲染的渲染。
二、装好后能怎么用(先看效果)
装好之后,你平时怎么敲curl,就怎么敲curlv,只是把响应从终端搬到了浏览器:
curlv https://api.github.com/repos/anthropics/anthropic-sdk-python# 浏览器弹出美化后的 JSONcurlv https://example.com# 浏览器渲染出网页详细案例见第六节。
三、先搞懂两个概念:PATH 和 ~/.zshrc
如果你从没配置过命令行,这两个概念是理解后面步骤的前提,一分钟讲清。
PATH 是什么?你在终端敲curl、git时,系统怎么知道去哪找这个程序?靠的是一个叫PATH的"目录清单"。系统会挨个翻清单里的目录,找到同名的可执行文件就运行。所以:只要把我们的脚本放进 PATH 里的某个目录,curlv就能像curl一样随处敲。
~/.zshrc 是什么?它是你每次打开终端时,系统自动读取的一个"启动配置文件"(~代表你的用户主目录)。你想让某个设置"永久生效、每次开终端都在",就写进这个文件。给 PATH 增加一个目录,就是写在这里。
我们要用哪个目录?~/.local/bin—— 这是 macOS/Linux 上约定俗成的"放个人小工具"的目录。我们把curlv脚本放进去,再确保这个目录在 PATH 里即可。
四、安装步骤(照着做)
第 1 步:创建存放目录
mkdir-p~/.local/bin-p的意思是"目录已存在也不报错",所以这条命令随便跑,安全。
第 2 步:创建脚本文件
把下面整段原样复制到终端回车。它会把脚本内容写入~/.local/bin/curlv这个文件:
cat>~/.local/bin/curlv<<'EOF' #!/usr/bin/env bash # curlv <url> [其它 curl 参数] —— 发请求并在浏览器里查看响应 set -euo pipefail if [[ $# -eq 0 ]]; then echo "用法: curlv <url> [其它 curl 参数]" >&2 exit 1 fi out="$(mktemp -t curlv)" body="$out.body" html="$out.html" # 抓响应体到文件,同时用 -w 拿到 Content-Type ctype=$(curl -sSL -o "$body" -w '%{content_type}' "$@") \ || { echo "curl 请求失败" >&2; exit 1; } if [[ "$ctype" == text/html* ]]; then cp "$body" "$html" # 本身是网页,直接用 elif [[ "$ctype" == application/json* ]] && command -v python3 >/dev/null; then { # JSON:美化 + 转义 + 包进 <pre> printf '<!doctype html><meta charset="utf-8"><body style="font:14px/1.6 monospace;padding:16px"><pre>' python3 -m json.tool --no-ensure-ascii "$body" | sed 's/&/\&/g; s/</\</g; s/>/\>/g' printf '</pre>' } > "$html" else { # 其它:原样转义后展示 printf '<!doctype html><meta charset="utf-8"><body style="font:14px/1.6 monospace;padding:16px"><pre>' sed 's/&/\&/g; s/</\</g; s/>/\>/g' "$body" printf '</pre>' } > "$html" fi open "$html" # macOS:默认浏览器打开 EOF说明:
cat > 文件 <<'EOF' ... EOF是一种"把中间这段文字写进文件"的标准写法,EOF只是结束标记。
第 3 步:给脚本可执行权限
chmod+x ~/.local/bin/curlv新建的文本文件默认不能当程序运行,chmod +x就是给它"可执行"许可。漏了这步会报 permission denied。
第 4 步:确认 ~/.local/bin 在 PATH 里,不在就加上
先检查:
echo$PATH|tr':''\n'|grep-q"$HOME/.local/bin"&&echo"已在 PATH"||echo"不在 PATH,需要第 5 步"- 如果输出"已在 PATH":跳过第 5 步,直接去第 6 步。
- 如果输出"不在 PATH":做下面第 5 步。
第 5 步(仅当上一步提示"不在 PATH")把目录加进 ~/.zshrc
echo'export PATH="$HOME/.local/bin:$PATH"'>>~/.zshrc这行的作用:每次开终端时,把~/.local/bin加到 PATH 清单最前面。>>是"追加到文件末尾",不会覆盖你原有内容。
第 6 步:让配置生效并验证
source~/.zshrc# 让刚改的配置立刻生效(或直接重开一个终端标签)whichcurlv# 应输出 /Users/你的用户名/.local/bin/curlvwhich能打印出路径,就说明装好了。
五、实现原理
整体三步:抓响应 → 按内容类型转成 HTML → 交给浏览器。
关键代码落点:
curl -o "$body" -w '%{content_type}' "$@":-o把响应体存文件供渲染;-w '%{content_type}'把服务器返回的类型打出来,作为分支依据;"$@"把你传的参数原样交给 curl,所以参数和 curl 一致。- 按类型分三路:HTML 直接用;JSON 用
python3 -m json.tool --no-ensure-ascii美化(--no-ensure-ascii让中文原样输出,不加的话会显示成国际这种转义);其它转义后塞进<pre>。非 HTML 都做&<>转义,防止内容里的尖括号被当标签解析。 - 统一存成
.html再open:直接 open 无后缀文件,macOS 可能用编辑器打开,加.html才稳定走浏览器。 set -euo pipefail:出错即停,让脚本更健壮。
六、使用案例
参数和curl完全一致,把命令名换成curlv即可:
# JSON 接口,自动美化缩进curlv https://api.github.com/repos/anthropics/anthropic-sdk-python# 普通网页,直接渲染curlv https://example.com# 先看安装脚本内容,再决定要不要执行(呼应第一节的初衷)curlv https://arch-qingzhou.oss-cn-beijing.aliyuncs.com/rd-cli/install.sh# 带 headercurlv-H"Authorization: Bearer <token>"https://api.xxx.com/user# POST 表单curlv-XPOST-d'name=tom'https://httpbin.org/post# basic auth / 带 cookiecurlv-uuser:pass https://xxx.com curlv--cookie"sid=abc"https://xxx.com七、注意事项
- 别再自己传
-o/--output:脚本靠-o把响应体存文件再渲染,你再传会覆盖它,导致浏览器展示为空。 - 别再自己传
-w:会覆盖脚本取 Content-Type 的逻辑,类型判断失效。 - 除以上两个外,其余 curl 参数(
-H-X-d-u--cookie等)均可照常追加。 - 为什么单独写脚本、不写进 ~/.zshrc?逻辑放独立文件,
~/.zshrc保持干净,存盘即生效无需反复source,而且任何 shell 或其它脚本都能调用;写进.zshrc的函数只在交互式终端里可用,还会让配置文件越堆越乱。
八、卸载
rm~/.local/bin/curlv删掉脚本即可。若第 5 步往~/.zshrc加过 PATH 那行,可留着(对其它工具也有用),想清理就手动编辑~/.zshrc删掉那一行。
参考
- curl
-w可用变量(含content_type):https://curl.se/docs/manpage.html#-w - macOS
open命令手册:https://ss64.com/mac/open.html - Python
json.tool模块:https://docs.python.org/3/library/json.html#module-json.tool
