タケハタのブログスマートフォン用の表示で見るタケハタのブログプログラマの生き方、働き方、技術について雑多に書いていくブログです。〜4インターセプターとメタデータ(後編)〜前回の記事でgRPCのインターセプターについて書きましたが、今回はその後編です。blog.takehata-engineer.com後処理とトレーラーについてです。今回はその前に「クライアントサイドからのgRPCの実行」についても書きます。これまでgrpccというクライアントツールを使ってきましたが、メタデータの扱いなどそろそろ説明がしづらくなってきたので、ここで1回書いておきます。APIをクライアントとしてgRPCのServiceを実行という形になります。APIとgRPCのServiceを両方作って試すことができます。JSONでデータの送信をするため、まずbuild.gradleのdependenciesにJacksonの依存関係を追加してください。implementation("com.fasterxml.jackson.module:jackson-module-kotlin")そして、下記のRestControllerとRequestクラスを実装してください。}}これはHTTP通信で「name」の値をリクエストし、gRPCのGreeterServiceにパラメータとして渡して実行する処理になっています。ポイントを簡単に説明します。1GreeterServiceのリクエストの生成GreeterService#sayHelloのリクエストパラメータを生成しています。ここではHTTP通信のリクエストで受け取った「name」の値をそのまま入れるだけになっています。レスポンスクラスと同じように、Builderパターンで生成します。2Channel(接続のための定義)の設定Channelは、gRPCで通信をするために必要な定義で、Connectionのようなものだと思ってください。いうクラスを使い、こちらもBuilderパターンで各パラメータを設定してChannelを生成することができます。接続先のIP、ポートをローカル環境に設定しています。指定していますが、こちらはSSL通信を無効にするためのメソッドになります(ローカル環境でSSLに対応していないため)。実際のプロダクト開発でSSLが有効な環境に接続する時は、このオプションを消さないとアクセスできないので、注意してください。Buffersで色々なファイルが生成されることを説明しましたが、その中に「Stub」が作られます。このStubを使うことで、生成したServiceのメソッドにアクセスすることができるようになっています。GreeterServiceのStubを作っています。メソッドを実行することで、Stubを生成できます。4GreeterServiceのメソッド実行あとはStubから対象のメソッドに最初に生成したリクエストクラスを渡して実行することで、gRPCのServiceに通信して実行します。起動して、下記のcurlコマンドでアクセスしてください。souda「GreeterService」で生成されたメッセージが返却されたと思います。APIへアクセス→gRPCのServiceを実行」という処理が実現できます。クライアントからヘッダを送信する前回の記事で紹介したヘッダの送信を、クライアントプログラムで実行します。いうインターフェースを実装します。いうクラスを使います。いう関数で、ヘッダを設定できます。ここでは「deviceName」というキーで、文字列を設定しています。クライアントアプリとの通信では、ここで端末名を取得してヘッダで送信する、というような使い方も想定されます。実装した「MetadataClientInterceptor」をクライアント側で有効にするため、「ClientController」を下記のように修正します。加えることで、このchannelを使ってgRPCのServiceを実行する時にインターセプターを通るようになります。インターセプター(後処理)やっと今回の本題、インターセプターでの後処理です。メイン処理でもログ出力するように変更インターセプター実装の前に、実行時の処理順をログで終えるようにするため、GreeterServiceも下記に変更します。sayHello」のログが出力されるようになります。前回の記事で作った「MetadataInterceptor」を、下記のように変更します。メソッドをオーバーライドすることで、メイン処理(ここではGreeterService#sayhello)の後に実行する処理を定義できます。close」というメッセージをログに出力するだけの処理です。piyosuアプリケーションのログに下記が出力されます。定義した処理が実行されています。処理は他のインターセプターにも定義することができます。headers)もし複数のインターセプターに定義した場合は、順番が後ろのインターセプターのcloseの処理から実行されます。2つのインターセプターを定義して、その両方にcloseの処理を実装している場合、1インターセプター1の処理2インターセプター2の処理3メイン処理4インターセプター2のclose処理5インターセプター1のclose処理という順番で実行されます。最後にトレーラーです。サーバーからのレスポンスには、メタデータとしてトレーラーも設定できます。「MetadataInterceptor」の処理を下記のように書き換えます。トレーラーを扱うことができます。ここでは「responseDataTime」という名前のキーで、現在日時を返すようにしています。「MetadataClientInterceptor」を下記のように変更します。オーバーライドすることで、クライアント側のインターセプターでの後処理を定義できます。してトレーラーを受け取っているので、キーを指定してgetすることで値を取得できます。sarinaアプリケーションのログに下記が出力されます。2019一番最後にクライアントがトレーラーで受け取った値を出力した行が増えていますね。次回はここまでの内容を通しでまとめて公開の予定ここまで4回の記事で、ある程度一連の流れが作れるようになりました。間が空いてしまったのもあり、書いている間にバラバラしてきた部分もあるので、次回は振り返りつつ通しで説明します。併せてサンプルも整備してすぐ試せるような形で作って、Githubに公開する予定です。2019の2日目の記事として書く予定なので、ぜひ読んでいただければと思います。はてなブログProプログラマとしての生き方とか、働き方とか、技術のことを雑多に書いていきます。CODE-セブンスコード-」のバックエンド技術DockerでMySQLを起動した時はバージョン差異に注意ブログの技術記事で書く内容をパターン分けしてみた2019年を雑に振り返る月別アーカイブはてなブログをはじめよう!take7010さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。