浏览器和 Postman 只能处理部分场景。命令行网络工具的优势在于脚本化、管道集成、精确控制,以及 SSH 远程环境下的可用性。
1. 为什么需要命令行网络工具
日常开发中,浏览器开发者工具和 Postman 能覆盖大部分 HTTP 调试需求。但以下场景它们无能为力:
- SSH 远程服务器:没有图形界面,只能靠命令行
- 自动化脚本:CI/CD 流水线中需要非交互式的 HTTP 请求
- 管道集成:将网络请求的输出直接传递给
jq、grep等工具处理 - 精确控制:自定义 Header、超时、重试策略、原始字节级调试
- 非 HTTP 协议:DNS 查询、gRPC 调用等浏览器无法直接处理的协议
本节介绍三个现代网络工具,分别覆盖 HTTP、DNS 和 gRPC 三个层面。工具不是重点,分层排查才是主线:先确认名字解析,再确认连接,再确认协议,再看应用逻辑。
2. xh — 现代 HTTP 客户端
xh 是 curl 的现代化替代,用 Rust 实现。它继承了 httpie 的友好语法,但速度更快、输出更美观。
与 curl / httpie 的对比
| 工具 | 语言 | 优势 | 劣势 |
|---|---|---|---|
curl | C | 功能最全、兼容性最好 | 语法繁琐(-X POST -H -d 组合) |
httpie | Python | 语法像说话一样自然 | Python 依赖、启动慢 |
xh | Rust | httpie 风格语法 + Rust 速度 | 生态不如 curl 成熟 |
基本用法
# GET 请求(默认方法,可省略)
$ xh https://api.example.com/users
# POST JSON(= 表示字符串,:= 表示原始值)
$ xh POST https://api.example.com/users name=John age:=30
# 添加请求头
$ xh https://api.example.com Authorization:"Bearer token123"
# 查询参数(== 表示 URL query string)
$ xh https://api.example.com/search q==hello page==1
# 查看完整请求和响应
$ xh --verbose https://httpbin.org/headers
# 下载文件
$ xh --download https://example.com/file.zip实际场景
API 调试:快速测试 REST 端点,不需要打开 Postman。
与 jq 组合:
xh https://api.github.com/repos/torvalds/linux | jq '.stargazers_count'
xh https://api.example.com/items | jq '.[].name'调试工作流:
# 登录获取 token
$ TOKEN=$(xh POST api.example.com/login username=admin password=secret | jq -r '.token')
# 用 token 做后续请求
$ xh GET api.example.com/admin "Authorization:Bearer $TOKEN" | jq '.users[] | .name'3. doggo — DNS 查询
doggo 是 dig 和 nslookup 的现代替代。彩色输出、多种 DNS 协议支持(包括 DoH/DoT 加密查询),让 DNS 排查不再痛苦。
DNS 基础回顾
DNS(Domain Name System)将人类可读的域名(如 github.com)转换为机器可用的 IP 地址(如 140.82.121.3)。常见的记录类型有:
- A 记录:域名 → IPv4 地址
- AAAA 记录:域名 → IPv6 地址
- MX 记录:邮件服务器地址
- CNAME 记录:域名别名
- TXT 记录:文本记录(常用于域名验证)
基本用法
# 基本查询(默认查 A 记录)
$ doggo example.com
# 指定记录类型
$ doggo example.com A # IPv4 地址
$ doggo example.com AAAA # IPv6 地址
$ doggo example.com MX # 邮件服务器
$ doggo example.com TXT # 文本记录
# 指定 DNS 服务器
$ doggo example.com @1.1.1.1 # Cloudflare
$ doggo example.com @8.8.8.8 # Google
# JSON 输出(便于脚本处理)
$ doggo example.com --json与 dig 的对比
| 特性 | dig | doggo |
|---|---|---|
| 输出可读性 | 冗长、格式固定 | 彩色、表格化 |
| JSON 支持 | 无 | 原生 --json |
| 加密 DNS | 需要额外配置 | 原生支持 DoH/DoT |
| 学习曲线 | 陡峭 | 直观 |
实际场景
排查 DNS 问题:对比本地 DNS 和公共 DNS 的解析结果,判断是本地缓存问题还是上游问题。
$ doggo example.com # 本地 DNS
$ doggo example.com @8.8.8.8 # Google DNS
# 两个结果不一致 → 本地 DNS 缓存有问题验证 DNS 传播:新域名上线后,检查多个公共 DNS 是否都已生效。
4. grpcurl — gRPC 调试
gRPC 是 Google 开发的高性能 RPC 框架,使用 Protobuf 序列化数据。它不是 HTTP,所以不能用 xh 或 curl 直接调试。grpcurl 就是 gRPC 世界的 curl。
gRPC vs REST 简要对比
| 特性 | REST | gRPC |
|---|---|---|
| 协议 | HTTP/1.1 或 HTTP/2 | HTTP/2 |
| 数据格式 | JSON / XML | Protobuf(二进制) |
| 类型系统 | 无(运行时校验) | 强类型(编译时校验) |
| 调试工具 | 浏览器、Postman、xh | grpcurl、BloomRPC |
| 适用场景 | 公开 API、Web 前端 | 微服务内部通信 |
基本用法
前提:gRPC 服务端需要启用 server reflection(反射),否则需要手动提供 .proto 文件。
# 列出可用服务
$ grpcurl -plaintext localhost:50051 list
# 列出某个服务的方法
$ grpcurl -plaintext localhost:50051 list mypackage.MyService
# 查看方法的参数结构
$ grpcurl -plaintext localhost:50051 describe mypackage.MyService/GetUser
# 调用方法
$ grpcurl -plaintext \
-d '{"name": "world"}' \
localhost:50051 \
Greeter/SayHello
# 带 metadata(类似 HTTP Header)
$ grpcurl -plaintext \
-H "Authorization: Bearer token" \
-d '{"id": 123}' \
localhost:50051 \
mypackage.MyService/GetUser
# 使用 .proto 文件(服务端没有反射时)
$ grpcurl -proto service.proto \
-d '{"name": "test"}' \
localhost:50051 \
mypackage.MyService/CreateUser实际场景
调试微服务:不需要写客户端代码,直接在命令行验证 gRPC 端点是否正常工作。
验证 API 契约:用 describe 查看方法签名,确认请求参数结构是否正确。
注意:本地开发的 gRPC 服务通常没有 TLS,必须加
-plaintext参数,否则会报证书错误。
5. 网络诊断方法论
遇到网络问题时,按协议层从下到上逐层排查,能快速定位根因。
分层排查思路
- DNS 层:
doggo example.com→ 域名能否解析? - 连接层:
ping example.com/nc -zv example.com 443→ 网络是否可达? - HTTP 层:
xh --verbose https://example.com→ 请求是否到达?响应是什么? - 应用层:查看服务端日志 → 业务逻辑是否有问题?
常用工具组合
doggo → 确认域名解析
↓
xh → 发送 HTTP 请求
↓
jq → 解析 JSON 响应
↓
分析结果协议层速查表
| 协议层 | 工具 | 排查什么 |
|---|---|---|
| DNS | doggo | 域名是否解析、记录类型是否正确 |
| 网络 | ping / nc | 主机是否可达、端口是否开放 |
| HTTP | xh --verbose | 请求头/响应头、状态码、响应体 |
| gRPC | grpcurl | 服务是否注册、方法调用是否正常 |
| 应用 | 服务日志 | 业务逻辑错误、异常堆栈 |
6. 使用原则
网络问题最怕一上来就猜。先分层,后定位。
DNS、连接、协议、应用分开看:域名解析正常不代表端口可达,HTTP 200 也不代表业务正确。
能用 verbose 就别靠感觉:请求头、响应头、状态码、TLS 信息、重定向链路往往直接暴露问题。
结构化输出方便自动化:doggo --json、HTTP JSON 响应和 jq 组合,适合放进脚本和 CI 诊断。
调试凭据要脱敏:复制请求命令、日志或截图前,检查 Authorization、Cookie、Token 和内部域名。
远程环境优先 CLI:SSH 进服务器、容器或 CI runner 时,命令行网络工具比 GUI 工具更可复现。