grpc-javaのClientでHeaderをセットしてリクエストする方法をまとめる
gRPCのClientで認証ヘッダーなどリクエストHeaderに値をセットしてgRPC Serverへリクエストするにはどうすればよいか?今回のエントリではgrpc-javaのClientでHeaderをセットしてリクエストする方法をまとめていく。
これまでのエントリではgRPC ServerのほうでClientからリクエストされたHeaderを参照する方法に ServerInterceptor
を用いることをまとめてきた。
Clientでも同様にInterceptorを用いてリクエストHeaderに値をセットすることになる。ClientInterceptor
を継承したAuthInterceptor
を用意する。
ClientInterceptorを準備する
class AuthInterceptor : ClientInterceptor { private val CUSTOM_HEADER_KEY = Metadata.Key.of("authorization", Metadata.ASCII_STRING_MARSHALLER) private val AUTH_TOKEN = "your-auth-token" override fun <ReqT : Any?, RespT : Any?> interceptCall(method: MethodDescriptor<ReqT, RespT>?, callOptions: CallOptions?, next: Channel?): ClientCall<ReqT, RespT> { return object : ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(next?.newCall(method, callOptions)) { override fun start(responseListener: ClientCall.Listener<RespT>, headers: Metadata) { /* put custom header */ headers.put(CUSTOM_HEADER_KEY, AUTH_TOKEN) super.start(object : ForwardingClientCallListener.SimpleForwardingClientCallListener<RespT>(responseListener) { override fun onHeaders(headers: Metadata) { super.onHeaders(headers) } }, headers) } } } }
CUSTOM_HEADER_KEY
変数にHeaderのKeyをauthorization
に定義したMetadataインスタンスをセットしているstart
関数をoverrideしてheaderにセットすればよい
これでauthorization
をキーにした認証ヘッダーをセットするAuthInterceptor
ができた。
ManagedChannelのビルド工程にinterceptorをセットする
gRPC ClientではManagedChannelをビルドすることになるが、ビルドアップのパラメータにintercept
がある。これに先ほど作ったAuthInterceptor
をセットすれば良い。
private fun getNettyChannel(): ManagedChannel { return NettyChannelBuilder .forAddress(DOMAIN, PORT) .sslContext( GrpcSslContexts.forClient() .trustManager(File(CERT_PATH)).build()) .intercept(AuthInterceptor()) .build() }
まとめ
- grpc-javaのClientでHeaderをセットしてリクエストする方法をまとめた
- ClientもServerと似ていて
ClientInterceptor
を継承したinterceptorを実装しChannelBuilderのintercept
にセットすればよい
コード
コードはgithubに置いています。
参考になるコードはこちら。