浏览器和 Postman 只能处理部分场景。命令行网络工具的优势在于脚本化、管道集成、精确控制,以及 SSH 远程环境下的可用性。

1. 为什么需要命令行网络工具

日常开发中,浏览器开发者工具和 Postman 能覆盖大部分 HTTP 调试需求。但以下场景它们无能为力:

  • SSH 远程服务器:没有图形界面,只能靠命令行
  • 自动化脚本:CI/CD 流水线中需要非交互式的 HTTP 请求
  • 管道集成:将网络请求的输出直接传递给 jqgrep 等工具处理
  • 精确控制:自定义 Header、超时、重试策略、原始字节级调试
  • 非 HTTP 协议:DNS 查询、gRPC 调用等浏览器无法直接处理的协议

本节介绍三个现代网络工具,分别覆盖 HTTP、DNS 和 gRPC 三个层面。工具不是重点,分层排查才是主线:先确认名字解析,再确认连接,再确认协议,再看应用逻辑。

2. xh — 现代 HTTP 客户端

xhcurl 的现代化替代,用 Rust 实现。它继承了 httpie 的友好语法,但速度更快、输出更美观。

与 curl / httpie 的对比

工具语言优势劣势
curlC功能最全、兼容性最好语法繁琐(-X POST -H -d 组合)
httpiePython语法像说话一样自然Python 依赖、启动慢
xhRusthttpie 风格语法 + 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 查询

doggodignslookup 的现代替代。彩色输出、多种 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 的对比

特性digdoggo
输出可读性冗长、格式固定彩色、表格化
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,所以不能用 xhcurl 直接调试。grpcurl 就是 gRPC 世界的 curl

gRPC vs REST 简要对比

特性RESTgRPC
协议HTTP/1.1 或 HTTP/2HTTP/2
数据格式JSON / XMLProtobuf(二进制)
类型系统无(运行时校验)强类型(编译时校验)
调试工具浏览器、Postman、xhgrpcurl、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. 网络诊断方法论

遇到网络问题时,按协议层从下到上逐层排查,能快速定位根因。

分层排查思路

  1. DNS 层doggo example.com → 域名能否解析?
  2. 连接层ping example.com / nc -zv example.com 443 → 网络是否可达?
  3. HTTP 层xh --verbose https://example.com → 请求是否到达?响应是什么?
  4. 应用层:查看服务端日志 → 业务逻辑是否有问题?

常用工具组合

doggo → 确认域名解析

xh    → 发送 HTTP 请求

jq    → 解析 JSON 响应

分析结果

协议层速查表

协议层工具排查什么
DNSdoggo域名是否解析、记录类型是否正确
网络ping / nc主机是否可达、端口是否开放
HTTPxh --verbose请求头/响应头、状态码、响应体
gRPCgrpcurl服务是否注册、方法调用是否正常
应用服务日志业务逻辑错误、异常堆栈

6. 使用原则

网络问题最怕一上来就猜。先分层,后定位。

DNS、连接、协议、应用分开看:域名解析正常不代表端口可达,HTTP 200 也不代表业务正确。

能用 verbose 就别靠感觉:请求头、响应头、状态码、TLS 信息、重定向链路往往直接暴露问题。

结构化输出方便自动化doggo --json、HTTP JSON 响应和 jq 组合,适合放进脚本和 CI 诊断。

调试凭据要脱敏:复制请求命令、日志或截图前,检查 Authorization、Cookie、Token 和内部域名。

远程环境优先 CLI:SSH 进服务器、容器或 CI runner 时,命令行网络工具比 GUI 工具更可复现。

延伸阅读