如何在flutter中为grpc移动客户端添加拦截器



我在Flutter Mobile Client中使用grpc+协议缓冲区。我的问题是,如何将拦截器添加到grpc请求/响应中,以便我能够从同一个地方记录尽可能多的日志?出于某种目的,我还需要将这些请求/响应发送给另一个客户。

我很感激你在这方面的帮助。

终于找到了答案!

首先创建拦截器类:

class InterceptorInvocation {
final int id;
final int unary;
final int streaming;
InterceptorInvocation(this.id, this.unary, this.streaming);
@override
String toString() {
return '{id: ${id}, unary: ${unary}, streaming: ${streaming}}';
}
}
class GRPCInterceptor implements ClientInterceptor {
final int _id = 1;
int _unary = 0;
int _streaming = 0;
static final _invocations = <InterceptorInvocation>[];
@override
ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request,
CallOptions options, ClientUnaryInvoker<Q, R> invoker) {
_invocations.add(InterceptorInvocation(_id, ++_unary, _streaming));
print('unary grpc message is here');
return invoker(method, request, _inject(options));
}
@override
ResponseStream<R> interceptStreaming<Q, R>(
ClientMethod<Q, R> method,
Stream<Q> requests,
CallOptions options,
ClientStreamingInvoker<Q, R> invoker) {
_invocations.add(InterceptorInvocation(_id, _unary, ++_streaming));

print('streaming grpc message is here');
return invoker(method, requests, _inject(options));
}
CallOptions _inject(CallOptions options) {
return options.mergedWith(CallOptions(metadata: {
'x-interceptor': _invocations.map((i) => i.toString()).join(', '),
}));
}
static void tearDown() {
_invocations.clear();
}
}

在您的服务客户端中,您需要这样调用它;

_grpcClient = TaskMobileVideoServiceClient(
clientChannel,
interceptors: [GRPCInterceptor()],
)

最新更新