Protobuf 解码
ApiCatcher 支持将HTTP/HTTPS请求/响应的 Protobuf 二进制数据解码为纯文本,以便于查看和分析。
默认情况下,ApiCatcher 会自动检测请求/响应的 Content-Type 头是否为 application/protobuf 或 application/x-protobuf 等常见的 Protobuf 内容类型,如果匹配,则会尝试解码。
private static func isProtobufContentType(_ contentType: String) -> Bool {
let ct = contentType.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
let mimeType = ct.components(separatedBy: ";").first?.trimmingCharacters(in: .whitespaces) ?? ct
return mimeType == "application/protobuf"
|| mimeType == "application/x-protobuf"
|| mimeType == "application/x-google-protobuf"
|| mimeType == "application/grpc"
|| mimeType == "application/grpc+proto"
|| mimeType == "application/protobuf+json"
|| mimeType == "x-protobuf"
}
如果 Content-Type 不是以上的类型,ApiCatcher不会尝试解码,但您可以使用解码工具来解码, 点击Body卡片上的“Unlock”图标,切换到“Protobuf”,然后点击“解码”按钮,即可解码。
默认解码结果可读性差,因为没有字段名,如果您有 *.desc 文件,可以导入 *.desc 文件,
以解码出字段名。如果*.desc 文件正确,解码结果将转成 JSON 格式,可读性更强。
有无 *.desc 文件的解码结果对比如图:

导入 Protobuf 描述符文件(*.desc)
什么是 *.desc 文件?
*.desc 文件是 Protobuf 文件描述符(File Descriptor) 的二进制序列化结果,包含了 Proto 文件中定义的所有消息结构、枚举、服务定义等元信息。它是解析 Protobuf 二进制数据的必要文件。
如果你手头有的是 *.proto 文件,需要先将其转换为 *.desc 文件才能用于 Protobuf 解码。
如何生成 *.desc 文件?
如果你有一批 *.proto 文件,可以使用 protoc 命令行工具生成一个或多个 *.desc 文件。步骤如下:
1. 安装 protobuf 命令行工具:
brew install protobuf
2. 准备 proto 文件:
创建一个 input 文件夹,将所有 *.proto 文件复制到该文件夹内。
3. 执行生成命令:
protoc --descriptor_set_out=output.desc \
--include_imports \
-I=/path/to/input \
/path/to/input/*.proto
参数说明:
| 参数 | 说明 |
|---|---|
--descriptor_set_out=output.desc | 指定输出的描述符文件路径 |
--include_imports | 将所有依赖的 import 文件也包含进去,确保导入后即可直接使用,无需额外引入依赖 |
-I=/path/to/input | 指定 proto 文件的搜索路径(import 路径的前缀) |
/path/to/input/*.proto | 要编译的 proto 文件(支持通配符) |
执行完毕后,会在当前目录生成 output.desc 文件,将其传到手机上,再在ApiCatcher中导入以备用。

当请求Body能Protobuf解码时,卡片会显示提示:“选择一个*.desc文件解码字段名”,并提供一个选择按钮,
点击选择按钮选择已经导入的 *.desc 文件,即可解码出字段名。当然,也可以此时再导入文件,
文件导入后会缓存到本地,可以在“设置->Protobuf文件管理”管理已导入的文件。
