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 ファイルが正しい場合、デコード結果はJSON形式に変換され、可読性が大幅に向上します。 *.desc ファイルの有無によるデコード結果の比較は次のとおりです:

記述子ファイルの有無によるProtobufデコード結果の比較:左側はフィールド名なし、右側は完全なフィールド名を表示

Protobuf記述子ファイル(*.desc)のインポート

*.desc ファイルとは?

*.desc ファイルは、Protobufファイル記述子(File Descriptor) のバイナリシリアライズ結果であり、Protoファイルで定義されたすべてのメッセージ構造、列挙型、サービス定義などのメタ情報を含みます。Protobufバイナリデータの解析に必要不可欠です。

手元に *.proto ファイルしかない場合は、Protobufデコードに使用する前に *.desc ファイルに変換する必要があります。

*.desc ファイルの生成方法

*.proto ファイルが複数ある場合、protoc コマンドラインツールを使用して1つまたは複数の *.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/inputprotoファイルの検索パスを指定(importパスのプレフィックス)
/path/to/input/*.protoコンパイルするprotoファイル(ワイルドカード対応)

実行後、現在のディレクトリに output.desc ファイルが生成されます。これを携帯電話に転送し、ApiCatcherにインポートして使用します。

*.descファイルのインポートと管理

リクエストBodyがProtobufデコード可能な場合、カードに「*.descファイルを選択してフィールド名をデコード」というヒントが表示され、選択ボタンが用意されています。 選択ボタンをクリックしてインポート済みの *.desc ファイルを選択すると、フィールド名がデコードされます。この時点でファイルをインポートすることもできます。 インポートされたファイルはローカルにキャッシュされ、「設定→Protobufファイル管理」で管理できます。

選択ボタンをクリックしてインポートした*.descファイルを選択しフィールド名をデコード