grpc-javaのClientでHeaderをセットしてリクエストする方法をまとめる

gRPCのClientで認証ヘッダーなどリクエストHeaderに値をセットしてgRPC Serverへリクエストするにはどうすればよいか?今回のエントリではgrpc-javaのClientでHeaderをセットしてリクエストする方法をまとめていく。

これまでのエントリではgRPC ServerのほうでClientからリクエストされたHeaderを参照する方法に ServerInterceptorを用いることをまとめてきた。

blog.soushi.me

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に置いています。

github.com

参考になるコードはこちら