到目前为止,我没有在 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);
}
};
}