web-dev-qa-db-ja.com

Android grpcクライアントにカスタムヘッダーを追加する方法?

Android grpc clientにカスタムヘッダーを追加する必要があります。正常に送信できません。

public class HeaderClientInterceptor implements ClientInterceptor {
    @Override
    public < ReqT, RespT > ClientCall < ReqT, RespT > interceptCall(MethodDescriptor < ReqT, RespT > method,
        CallOptions callOptions, Channel next) {

        return new SimpleForwardingClientCall < ReqT, RespT > (next.newCall(method, callOptions)) {

            @Override
            public void start(Listener < RespT > responseListener, Metadata headers) {
                /* put custom header */
                Timber.d("header sending to server:");


                Metadata fixedHeaders = new Metadata();
                Metadata.Key < String > key =
                    Metadata.Key.of("Grps-Matches-Key", Metadata.ASCII_STRING_MARSHALLER);
                fixedHeaders.put(key, "primary.secondary");

                headers.merge(fixedHeaders);

                super.start(new SimpleForwardingClientCallListener < RespT > (responseListener) {
                    @Override
                    public void onHeaders(Metadata headers) {
                        /**
                         * if you don't need receive header from server,
                         * you can use {@link io.grpc.stub.MetadataUtils attachHeaders}
                         * directly to send header
                         */

                        Timber.e("header received from server:" + headers.toString());
                        super.onHeaders(headers);
                    }
                }, headers);
            }
        };
    }
}

編集:この方法を使用してカスタムヘッダーが正常に追加されました

今私のgrpcコールでは、私はこのように呼んでいます

ClientInterceptor interceptor = new HeaderClientInterceptor();
Channel channel = ManagedChannelBuilder.forAddress(BuildConfig.Host, BuildConfig.PORT).build();
Channel channelWithHeader = ClientInterceptors.intercept(channel, interceptor);
ServiceGrpc.ServiceBlockingStub service = ServiceGrpc.newBlockingStub(channelWithHeader);

上記のリクエストを作成し、以下のように擬似呼び出しで呼び出します。

Iterator<Model> dataItems = service.getItems(SOMERequestBuilderObj);

私はこのようなカスタムヘッダーを追加しようとしています"Grps-Matches-Key : primary.secondary"

Rest API呼び出しでは、これを次のようなヘッダーとして追加します。

builder.header("Grps-Matches-Key", "primary.secondary");

お役に立てれば。

10
rana

問題の編集済みバージョンも機能します。GRPCには、ヘッダー(メタデータと呼ばれる)を追加する方法が多数あります。上記の質問のようにインターセプターを使用してメタデータを追加したり、クライアントスタブのメタデータを追加したり、クライアントスタブチャネルでリクエストを行う前に追加したりできます。

// create a custom header
Metadata header=new Metadata();
Metadata.Key<String> key =
    Metadata.Key.of("Grps-Matches-Key", Metadata.ASCII_STRING_MARSHALLER);
header.put(key, "match.items");

// create client stub
ServiceGrpc.ServiceBlockingStub stub = ServiceGrpc
    .newBlockingStub(channel);

ここに示すように、MetadataUtilsを使用してリクエストを行う前にヘッダーを追加します

stub = MetadataUtils.attachHeaders(stub, header);
20
rana