xh:比 curl 更友好的 HTTP 客户端
用 Rust 实现的 HTTPie 替代品。目前 GitHub 7,921 stars,MIT 许可证,一个二进制文件就能跑。
为什么需要另一个 HTTP 客户端
curl 是终端里最通用的 HTTP 工具,但它的语法并不友好。发送一个 JSON POST 请求:
curl -X POST https://api.example.com/data \
-H "Content-Type: application/json" \
-H "x-api-key: secret" \
-d '{"name":"白物集","type":"blog"}'
手动拼 JSON 字符串、写 Content-Type 头、处理转义——每次写这种命令都在重复做无用功。HTTPie 解决了这个问题,但 Python 实现的启动速度和依赖管理在高频使用时明显拖后腿。
xh 用 Rust 重新实现了 HTTPie 的核心设计,单二进制部署,启动速度接近瞬发。
核心亮点
1. 自然语言的请求语法
xh 的请求项语法和 HTTPie 兼容,把参数名和值直接用 = 连接:
xh POST api.example.com/data name=白物集 type=blog x-api-key:secret
不需要手动构造 JSON,不需要写 \ 换行,不需要操心 Content-Type。xh 自动推断请求格式——看到 key=value 就自动设为 JSON。
查询参数用 ==,自定义头用 :,文件上传用 @:
# 查询参数
xh get api.example.com/search q==rust sort==stars
# 自定义头
xh get api.example.com/user Authorization:"Bearer token123"
# 文件上传
xh POST api.example.com/upload avatar@~/photo.jpg
2. 智能输出格式化
xh 对响应内容自动格式化+高亮。JSON 自动 indent 和着色,不需要额外 pipe 到 jq。
xh httpbin.org/json
# 输出直接显示格式化后的 JSON,带语法高亮
输出控制也灵活:-h 只看头,-b 只看体,-v 看完整请求+响应。
3. --curl 参数输出 curl 等价命令
一个实用小功能:xh 可以输出当前请求对应的 curl 命令。调试时在 xh 和 curl 之间切换非常方便。
xh --curl POST api.example.com/data name=test
# 输出等价的 curl 命令,方便粘贴到文档或 CI 脚本
4. 单二进制 + HTTP/2 支持
xh 编译成一个静态链接的二进制文件,没有运行时依赖。从 GitHub Releases 下载即可运行。支持 HTTP/2,这是 HTTPie 还没做到的。
白物集实战
白物集的内容管线每天在脚本里大量使用 curl 调用后端 API——POST 文章、GET 知识卡片、PATCH 修复内容。每次写 curl 命令都要处理 HTTP 头的拼写和 JSON 构造。
用 xh 替换后,API 调用变成:
# 发布文章(之前用 curl 需要 6 行)
xh POST ai.golfr20.cn/api/v1/content/ingest \
x-api-key:*** \
title="xh 使用指南" \
content_md@/tmp/article.md \
status=published
文件上传用 @ 语法,直接在命令行引用文件路径,不需要 -d @/tmp/payload.json。对于日常调试 API、快速验证接口响应、临时查数据库——xh 比 curl 快得多。
适合什么场景
- API 调试:日常测试 REST API、验证接口返回
- CI/CD 脚本:xh 的
--check-status默认启用,非 2xx 自动非零退出,适合管道 - 快速验证:不想打开 Postman 或 Insomnia 的时候
- 文档示例:xh 命令可读性高,比 curl 更适合写在 README 或 Wiki 里
不适合什么场景
- 已有 curl 脚本的长期维护项目:xh 不是 curl 的直接替代,迁移现有脚本有成本。用
--curl参数逐条转换还可以接受。 - 需要 HTTPie 插件系统的场景:xh 不支持插件。
- Windows 非终端环境:Windows 上的 GUI 工具(Postman、Bruno)体验更好。
快速上手
步骤 1:安装
macOS 直接用 Homebrew:
brew install xh
Linux 用一键安装脚本:
curl -sfL https://raw.githubusercontent.com/ducaale/xh/master/install.sh | sh
步骤 2:发一个 GET 请求
xhs httpbin.org/json
xhs 是 xh 的 HTTPS 版本,默认使用 HTTPS 协议。
步骤 3:发一个 POST 请求
xh POST httpbin.org/post name=白物集 stars:=7921
:= 表示非字符串类型的 JSON 值(数字、布尔、数组)。
步骤 4:带认证的 API 调用
xh GET api.example.com/users Authorization:"Bearer eyJhbGci..."
步骤 5:把结果保存到文件
xh -d httpbin.org/json -o response.json
从安装到第一次成功调用,不超过 30 秒。
总结
xh 是 HTTPie 的 Rust 替代品,定位精准——解决高频 API 调用场景下的冗余操作。单二进制、HTTP/2、智能输出格式化,在日常开发中能省下大量重复劳动。如果你每天都要在终端和 API 打交道,xh 值得放进工具箱。