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

ran*_*ana 8 client android metadata grpc grpc-java

我必须在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);
  }
};
}
}
Run Code Online (Sandbox Code Playgroud)

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

现在在我的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);
Run Code Online (Sandbox Code Playgroud)

///我构建了上面的请求并在伪调用中调用它,如下所示.

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


 I am trying to add a custom header like this -
Run Code Online (Sandbox Code Playgroud)

"Grps-Matches-Key:primary.secondary"

在Rest API调用中,我会将其添加为标题,例如builder.header("Grps-Matches-Key","primary.secondary");

希望这可以帮助 .

ran*_*ana 17

问题中的编辑版本也有效.在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);
Run Code Online (Sandbox Code Playgroud)

在使用MetadataUtils进行任何请求之前添加标头

stub = MetadataUtils.attachHeaders(stub, header);
Run Code Online (Sandbox Code Playgroud)

  • 两者都应该有效。添加拦截器或作为元数据 (2认同)