1. 導入:なぜgRPCurlが必要なのか
gRPCは高速で効率的な通信を実現しますが、そのバイナリ形式ゆえに、普段使い慣れたcURLやブラウザで直接APIを叩くことができません。「APIを修正したけれど、確認のためにわざわざ専用のクライアントアプリを書くのは面倒だ」と感じたことはありませんか?そんな課題を解決するのがgRPCurlです。これを使えば、コマンドラインから手軽にgRPCサーバーへリクエストを送り、JSON形式でレスポンスを確認できるようになります。
2. 基礎知識:gRPCurlが動く仕組み
gRPCurlを理解するために、以下の2つのキーワードを押さえておきましょう。
・gRPCサーバーのリフレクション機能
gRPCは本来、`.proto`ファイル(APIの定義書)がないと通信内容がわかりません。しかし、サーバー側で「リフレクション(サーバー反映)」という機能を有効にすると、クライアントは「どんなサービスやメソッドがあるか」をサーバーに問い合わせることができます。gRPCurlはこの機能を使うことで、定義ファイルなしでもAPIを探索・実行できます。
・JSONとバイナリの変換
gRPCは内部でProtocol Buffersという形式でデータを送りますが、gRPCurlは人間が扱いやすいJSONを読み込み、それを内部でバイナリに変換してサーバーへ送信してくれます。
3. 実装/解決策:gRPCurlを使ってみよう
まずはインストールから始めます。MacであればHomebrewを使って簡単に導入できます。
インストールコマンド:
brew install grpcurl
サーバーがリフレクションを有効にしている場合、以下のステップで疎通確認を行います。
1. サーバーのサービス一覧を確認する
2. メソッドの引数を確認する
3. 実際にリクエストを送る
4. サンプルプログラム:コマンド実行例
以下は、ローカルで動いているgRPCサーバー(ポート50051)に対して、ユーザー情報を取得するリクエストを送る例です。
1. サーバーで利用可能なサービス一覧を取得
grpcurl -plaintext localhost:50051 list
2. 特定のサービスのメソッド詳細(引数など)を確認
grpcurl -plaintext localhost:50051 describe mypackage.UserService
3. 実際にJSON引数を指定してリクエストを送信
grpcurl -plaintext -d ‘{“user_id”: “123”}’ localhost:50051 mypackage.UserService/GetUser
コメント解説:
-plaintext: TLS(暗号化)を使用しない場合に指定。開発環境では必須です。
-d: 送信するJSONデータ(文字列)。
localhost:50051: 接続先のサーバーアドレス。
mypackage.UserService/GetUser: 呼び出したいメソッドのフルパス。
5. 応用・注意点:現場でハマらないために
・リフレクションが無効な場合
本番環境など、セキュリティ上の理由でリフレクションが無効になっている場合があります。その際は、`-proto`オプションを使って、ローカルにある`.proto`ファイルを指定して実行する必要があります。
例: grpcurl -plaintext -proto ./user.proto -d ‘{“user_id”: “123”}’ localhost:50051 mypackage.UserService/GetUser
・TLS接続時の注意
本番環境へ接続する場合は`-plaintext`を外し、`-cacert`オプションで証明書を指定する必要があります。
・陥りやすいミス
JSONのキー名が`.proto`ファイルで定義されたフィールド名と完全に一致しているか確認してください。大文字小文字の違いでもエラーになるため、`describe`コマンドで定義をよく確認するのがコツです。
gRPCurlを使いこなせば、開発中の疎通確認スピードが劇的に向上します。ぜひ日々のデバッグに取り入れてみてください。

コメント