Protobuf 解码

ApiCatcher 支持将HTTP/HTTPS请求/响应的 Protobuf 二进制数据解码为纯文本,以便于查看和分析。

默认情况下,ApiCatcher 会自动检测请求/响应的 Content-Type 头是否为 application/protobufapplication/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 解码结果对比:左侧无字段名,右侧显示完整字段名

导入 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中导入以备用。

导入 *.desc 文件 & 管理导入的 *.desc 文件

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

点击选择按钮选择导入的 *.desc 文件解码字段名