Android 如何在 grpc 客户端中添加自定义 header ?

标签 android client metadata grpc grpc-java

我必须在 android grpc 客户端中添加自定义 header 。无法发送成功。

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

编辑:使用这种方式成功添加了自定义 header

现在在我的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);

我正在尝试添加这样的自定义 header "Grps-Matches-Key : primary.secondary"

在 Rest API 调用中,我会将其添加为 header ,例如

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

希望这对您有所帮助。

最佳答案

问题中的编辑版本也有效。在 GRPC 中,有很多方法可以添加标题(称为元数据)。我们可以使用拦截器像我上面的问题一样添加元数据,或者我们可以为客户端 stub 添加元数据,或者您可以在客户端 stub channel 中发出请求之前添加它。

// 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 在发出任何请求之前添加 header ,如此处所示

stub.withInterceptors(MetadataUtils.newAttachHeadersInterceptor(header)) 

关于Android 如何在 grpc 客户端中添加自定义 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45125601/

相关文章:

android - 如何获取流式在线广播的元数据

java - WebSphere MQ 的独立 Java JMS 客户端

java - "java.io.StreamCorruptedException: invalid type code: AC"- 从服务器-客户端 java 程序运行客户端代码时发现错误

php - 具有多个后元值关键字的 Wordpress 搜索(无插件)

android - PagerAdapter 的页面更改回调

android - 带有浅色应用程序主题的深色工具栏

安卓 :Problem with parameter passing(webservices)

android - FragmentPagerAdapter getItem 未被调用

java热点从服务器到客户端

java - 需要帮助理解 JAudioTagger、标签映射