0

到目前为止,我没有在 GRPC-Java 中使用 CallCredentials。对于某些调用,我需要在标头中传递多个字段。我已经填充了下面给出的标头并添加了一个拦截器,该拦截器在使用异步存根/通道时被调用。

填充标题

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 字段作为传递给客户端拦截器的实例变量。我可以看到标头包含预期的值,直到它进入开始调用,此时它变为空(我显然没有看到在服务器端填充的标头)。解决此问题的任何想法(或者我应该使用 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);
        }
    };
}  
4

1 回答 1

-1

我必须通过方法调用访问标题,之后我才能获取标题键/值。

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

&

   public Metadata getHeaders() {
        return headers;
}
于 2017-03-14T17:12:21.407 回答