2017-07-16 70 views
0

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


I am trying to add a custom header like this - 

“GRPS百搭重点:primary.secondary”

在REST API调用,我会加入这个作为标题一样, builder.header(“GRPS-Matches- Key“,”primary.secondary“);

希望这会有所帮助。

回答

3

该问题中的编辑版本也起作用。在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); 
任何请求之前添加报头
相关问题