首页 > 解决方案 > GRPC 拦截器 - 通过数字指示器修改消息

问题描述

我正在学习 java 中的 grpc 服务,并试图弄清楚是否可以拦截和修改请求。

我想到了根据protobuf中指定的数字来修改grpc请求。

示例 Protobuf:

message PersonRequest {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

@Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall
            (ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
     // Get by number 1 (name from proto)
     // change the name
     // send the updated request

}

有什么方法可以做到这一点。

标签: grpcgrpc-java

解决方案


您可以在以下服务器拦截器中修改请求消息。然后你的 serviceImpl 将收到修改后的请求消息并进行处理。

import io.grpc.ForwardingServerCallListener.SimpleForwardingServerCallListener;
...
 @Override
 public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
     ServerCall<ReqT, RespT> call, Metadata headers,
     ServerCallHandler<ReqT, RespT> next) {
    ServerCall.Listener<ReqT> listener = next.startCall(call);
    return new SimpleForwardingServerCallListener<ReqT>(listener) {
      @Override
      public void onMessage(ReqT message) {
        ReqT modifiedMessage = modify(message);
        delegate().onMessage(modifiedMessage);
      }
    };
 }

推荐阅读