【问题标题】:How to set header response in grpc java server如何在 grpc java 服务器中设置标头响应
【发布时间】:2021-10-27 16:57:34
【问题描述】:
 @Override
    public void getResult(Request request, StreamObserver<Response> responseObserver) {
       responseObserver.onNext(new Respons("check"));
       responseObserver.onCompleted();
    }

如何发送标头响应?

在 golang 中我可以通过这样做发送它,但在 java 中我不知道

func (s *server) SomeRPC(ctx context.Context, in *pb.someRequest) (*pb.someResponse, error) {
    // create and send header
    header := metadata.Pairs("header-key", "val")
    grpc.SendHeader(ctx, header)
    // create and set trailer
    trailer := metadata.Pairs("trailer-key", "val")
    grpc.SetTrailer(ctx, trailer)
}

【问题讨论】:

  • 你想在响应头中发送什么?大多数元数据处理最好在拦截器中完成。
  • @EricAnderson 我有一个用例,我想在服务器端的响应标头中发送一些编码值,还有其他方法吗?
  • 您基本上只是改写了“想要在响应标头中发送某些内容”,而没有任何进一步的上下文。我在问你的用例。这是什么类型的值,为什么需要进入响应头?

标签: grpc grpc-java proto grpc-go


【解决方案1】:

您可以像这样实现ServerInterceptor 并在sendHeaders 方法中修改标头:

public class CustomServerInterceptor implements ServerInterceptor {
    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
        CustomServerCall<ReqT, RespT> customServerCall = new CustomServerCall<>(call);
        ServerCall.Listener<ReqT> listener = next.startCall(customServerCall, headers);
        return new CustomServerCallListener<>(listener);
    }
}

class CustomServerCall<ReqT, RespT> extends ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT> {
    // ...
    @Override
    public void sendHeaders(Metadata headers) {
        // do what you want here
        super.sendHeaders(headers);
    }
}

class CustomServerCallListener<ReqT> extends ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT> {
// ...
}

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 2019-04-27
    • 2018-11-10
    • 2020-03-29
    • 2019-04-02
    • 2019-04-05
    • 2015-03-14
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多