grpc - 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
}
有什么方法可以做到这一点。
解决方案
您可以在以下服务器拦截器中修改请求消息。然后你的 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);
}
};
}
推荐阅读
- css - 如何使用弹性框让 BS4 nav-item 填充导航栏高度,文本垂直居中
- jmeter - Jmeter:非 HTTP 响应代码:java.net.URISyntaxException
- ffmpeg - 使用ffmpeg指定绝对hls_fmp4_init_filename时如何修复m3u8中的EXT-X-MAP:URI?
- javascript - 将工具提示添加到列表项
- php - Woocommerce中儿童的不同价格
- reactjs - TypeScript 错误:类型 '() => boolean' 不可分配给类型 'boolean'
- python - Python,Django - 查找已安装包的文件夹
- javascript - 在带有触摸事件的移动浏览器上模拟鼠标悬停的最佳方法是什么?
- javascript - 仅当存在特定元素时才将类添加到动态生成的 div - Slick Slider
- asp.net - asp.net - 允许用户查看页面,但需要密码才能发帖