本文介绍了Android如何在GRPC客户端添加自定义头部?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须在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"

在睡觉应用编程接口调用中,我会将其添加为标题,如下所示

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

希望这对您有帮助。

推荐答案

问题中编辑过的版本也可以使用。在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);

这篇关于Android如何在GRPC客户端添加自定义头部?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-29 13:29
查看更多