在进行GRPC调用之后,您可以判断reply
参数内的响应.
一元拦截器的参数之一是invoker
函数,它的类型为UnaryInvoker
.在一元拦截器中,您应该调用此函数,如文档中所述:
调用器是完成RPC的处理程序,拦截器负责调用它
而invoker
本身就把req
和reply
作为自变量.您可以调用调用器and then判断reply
.
But, how to inspect it?接口reply
的动态类型应该是指向您的ProtoBuffer模式中定义的GRPC处理程序的返回类型的指针.您可以判断method
的值,以了解预期的返回类型.
为了更好地理解这一点,您可以查看一下由protoc
生成的代码.GRPC方法的实现显示了用于调用Invoke
的实际参数是什么.
假设您有一个协议缓冲区,如下所示:
package foo;
service MyService {
rpc GetFoo(FooRequest) returns (FooResponse);
}
为GetFoo
方法生成的代码如下所示:
func (c *myServiceClient) GetFoo(ctx context.Context, in *FooRequest, opts ...grpc.CallOption) (*FooResponse, error) {
out := new(FooResponse)
err := c.cc.Invoke(ctx, "/foo.MyService/GetFoo", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
因此,您可以根据值method
知道reply
的类型.然后,您可以获得以下示例一元拦截器:
grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
// some interceptor logic
// ...
// then you must call invoker
err := invoker(ctx, method, req, reply, cc, opts...)
if err != nil {
// handle error
}
// finally you can inspect reply before returning
switch method {
case "/foo.MyService/GetFoo":
fooResp := reply.(*FooResponse)
// access fields to do whatever you want
// other switch cases as needed
}
return nil
}),