为 grpc java 客户端请求填充 header

populating header for grpc java client request

我现在没有在 GRPC-Java 中使用 CallCredentials。对于某些调用,我需要在 header 中传入多个字段。我已经填充了下面给出的 headers 并添加了一个拦截器,它在使用异步 Stub/channel 时被调用。

填充header

public Metadata generateHeader() {
    Metadata.Key<String> jwtKey = Metadata.Key.of("jwt", Metadata.ASCII_STRING_MARSHALLER);
    headers.put(jwtKey, jwt);
    Metadata.Key<String> testKey = Metadata.Key.of("testID", Metadata.ASCII_STRING_MARSHALLER);
    headers.put(testKey, testID);
    return headers;
} 

我正在访问 headers 字段作为传递给客户端拦截器的实例变量。我可以看到 headers 包含预期值,直到它进入开始调用,此时它变为空(我显然没有看到 headers 在服务器端填充)。解决此问题的任何想法(或者我应该使用 CallCredentials)。 GRPC-Java 的文档需要大量工作。

@Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
        MethodDescriptor<ReqT, RespT> method,
        CallOptions callOptions,
        Channel next) {
    log.info("HEADER INTERCEPTOR{}", headers.get(Metadata.Key.of("jwt", Metadata.ASCII_STRING_MARSHALLER)));
    ClientCall<ReqT, RespT> call = next.newCall(method, callOptions);
    return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(call) {
        @Override
        public void start(ClientCall.Listener<RespT> responseListener, Metadata headers) {
            log.info("HEADER START {}", headers.keys());
            super.start(responseListener, headers);
        }
    };
}  

我必须通过方法调用访问 headers,然后我才能获得 header keys/values。

Metadata cached = getHeaders().get(Metadata.Key.of("testID", Metadata.ASCII_STRING_MARSHALLER)));
headers.merge(cached);

&

   public Metadata getHeaders() {
        return headers;
}