当前位置: 首页 > news >正文

加强版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 是什么?你在终端敲curlgit时,系统怎么知道去哪找这个程序?靠的是一个叫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/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g' printf '</pre>' } > "$html" else { # 其它:原样转义后展示 printf '<!doctype html><meta charset="utf-8"><body style="font:14px/1.6 monospace;padding:16px"><pre>' sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/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/curlv

which能打印出路径,就说明装好了。

五、实现原理

整体三步:抓响应 → 按内容类型转成 HTML → 交给浏览器。

text/html

application/json

其它

curlv [参数]

curl -sSL -o body -w '%{content_type}'
抓响应体 + 拿 Content-Type

Content-Type?

原样作为网页

python3 -m json.tool 美化
+ 转义 + 包进 <pre>

转义后包进 <pre>

写成 .html 文件

open → 默认浏览器打开

关键代码落点:

  • 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 都做&<>转义,防止内容里的尖括号被当标签解析。
  • 统一存成.htmlopen:直接 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
  • macOSopen命令手册:https://ss64.com/mac/open.html
  • Pythonjson.tool模块:https://docs.python.org/3/library/json.html#module-json.tool
http://www.jsqmd.com/news/1139656/

相关文章:

  • CTF网络取证实战:20个Wireshark高效解题技巧
  • SRAM vs DRAM 性能对比:从6管单元到1T1C,延迟差10倍的硬件原理
  • 基于OpenClaw多Agent系统构建Obsidian智能记忆系统实践
  • Hermes Agent网关:多智能体协同的运行时中枢与生产落地指南
  • Sklearn 1.4 回归评估指标实战:6大指标在糖尿病数据集上的量化对比
  • Windows 11 TensorFlow GPU 3种替代方案评测:WSL2 vs Docker vs 降级2.10
  • B300 GPU维修实践:5类高频故障现象及Root Cause分析
  • 前后端SHA256加密结果不一致?八大原因与解决方案全解析
  • BigArray#
  • .NET 10 的正则性能现在什么水平?我拿它和 Go、Python、C++、PCRE2 测了一轮
  • WaveTools:一键解锁《鸣潮》120FPS高帧率与画质优化完整指南
  • 北京华恒智信为酒店行业搭建三维人才分流体系化解业务用人难题
  • 跨平台视频解密工具:轻松下载微信视频号、抖音等加密资源
  • 3分钟制作USB启动盘:Rufus极速格式化工具全攻略
  • ORB-SLAM3 SearchByBoW 2
  • 写在开头:我为什么开这个专栏?
  • 今天偶然发现有一个评论有500个赞
  • 宝可梦实景图数据集在无人机导航中的计算机视觉应用
  • 终极指南:大麦网双端自动抢票技术方案与实战部署
  • TwinCAT3 3.1 配置汇川 SV660N:EtherCAT 扫描与 8388608 分辨率设置详解
  • 摩托车混流装配防错引导系统硬件怎么选?海雅达 Model 10X 工业三防平板电脑采购预算与部署成本评估
  • 成对评估上包络线:有界指标的稳健效果边界计算方法
  • Metasploit进阶:从set payload到generate命令的Shellcode生成与免杀实战
  • Linux防火墙极简配置指南:10分钟掌握firewalld核心安全策略
  • 常见硬件设计问题分析及解决方案-EMC静电问题
  • Seedance 2.5本地AI生图与视频生成:部署指南与参数调优
  • F28377D Modbus RTU移植:硬件时序、寄存器映射与实时性硬核实践
  • 从SSTI模板注入到docker容器内网渗透:靶机练习之Tempus_fugit3
  • Windows系统下Xray被动扫描环境配置全攻略:从证书安装到代理设置
  • 狼人杀不只是游戏:9 个大模型的多轮博弈能力观察