【问题标题】:gRPC response headers based on the incoming value基于传入值的 gRPC 响应标头
【发布时间】:2019-07-20 10:42:09
【问题描述】:

我需要根据传入的值发送 gRPC 请求的响应标头。这样做的方法是使用 ServerInterceptor。但在这里我有点卡住了。我可以使用ForwardingServerCallListener.SimpleForwardingServerCallListener#onMessage 拦截传入的值,但我看不到将这个值放入上下文并在ForwardingServerCall.SimpleForwardingServerCall#sendHeaders 中读取它的方法。

这是我的代码:

public class FooInterceptor implements ServerInterceptor {

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
        var serverCall = new ForwardingServerCall.SimpleForwardingServerCall<>(call) {
            @Override
            public void sendHeaders(Metadata headers) {
                //Here I should get the value from the context and add it to the headers
                //var foo = CONTEXT_KEY.get("foo");
                //headers.put(METADATA_KEY, foo);
                super.sendHeaders(headers);
            }
        }
        ServerCall.Listener<ReqT> listenerWithContext = Contexts
                .interceptCall(Context.current(), serverCall, headers, next);
        return new ForwardingServerCallListener.SimpleForwardingServerCallListener<>(listenerWithContext) {
            @Override
            public void onMessage(ReqT message) {
                if (message instanceof FooRequest) {
                    var foo = ((FooRequest) message).getFoo();
                    //How to add it to context?
                }
                super.onMessage(message);
            }
        };
    }
}

所以问题出在ForwardingServerCallListener.SimpleForwardingServerCallListener#onMessage 方法中,我能够从消息中获取值,但我无法用新值重写那里的上下文。 任何想法/建议将不胜感激!

【问题讨论】:

    标签: java header grpc interceptor grpc-java


    【解决方案1】:

    我找到了一种解决方法,它不是最优雅的解决方案,但它似乎有效。由于还没有其他答案,所以将其发布在这里。

    我已经设法使用请求标头传递值。 因此,在ForwardingServerCallListener.SimpleForwardingServerCallListener#onMessage 中,我将值设置为请求标头,在ForwardingServerCall.SimpleForwardingServerCall#sendHeaders 中,我将请求标头中的值写入响应标头。

    代码如下:

    public class FooInterceptor implements ServerInterceptor {
    
        @Override
        public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
            var serverCall = new ForwardingServerCall.SimpleForwardingServerCall<>(call) {
                @Override
                public void sendHeaders(Metadata responseHeaders) {
                    var foo = headers.get(Metadata.Key.of("x-value"), Metadata.ASCII_STRING_MARSHALLER));
                    responseHeaders.put(Metadata.Key.of("x-value"), Metadata.ASCII_STRING_MARSHALLER), foo);
                    super.sendHeaders(responseHeaders);
                }
            }
            ServerCall.Listener<ReqT> listenerWithContext = Contexts
                    .interceptCall(Context.current(), serverCall, headers, next);
            return new ForwardingServerCallListener.SimpleForwardingServerCallListener<>(listenerWithContext) {
                @Override
                public void onMessage(ReqT message) {
                    if (message instanceof FooRequest) {
                        var foo = ((FooRequest) message).getFoo();
                        headers.put(Metadata.Key.of("x-value"), Metadata.ASCII_STRING_MARSHALLER), foo);
                    }
                    super.onMessage(message);
                }
            };
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2013-06-04
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多