如何在Android中的grpc客户端中添加自定义头部?

25

我需要在一个Android的grpc客户端中添加自定义头信息,但是我无法成功地发送它。

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");

希望这可以帮到您。

2
可以使用预定义的拦截器与 MetadataUtils.newAttachHeadersInterceptor(metadata) 一起使用。 - kza
1个回答

46

问题中的编辑版本也是有效的。在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.withInterceptors(MetadataUtils.newAttachHeadersInterceptor(header)) 

所以我们不需要拦截器来附加头部,就像你提到的那样,对吗? - Tarun Rawat
2
两种方法都可以。可以添加拦截器,也可以作为元数据。 - rana
attachHeaders现已弃用,请使用以下内容: stub.withInterceptors(MetadataUtils.newAttachHeadersInterceptor(header)) - ozma
@ozma 你确定吗?我使用的代码是 MetadataUtils.attachHeaders,它并没有显示已被弃用。 - Arefe
@Heisenberg 你使用的是哪个版本?请查看文档 https://grpc.github.io/grpc-java/javadoc/io/grpc/stub/MetadataUtils.html#attachHeaders-T-io.grpc.Metadata- - ozma
@Heisenberg 这是很久以前的事情了 lol,在我的一个之前的项目中。 - rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接