1 回答
TA贡献1842条经验 获得超21个赞
不,函数
GetToken(ctx context.Context, req *AuthData) (*Token, error)
与以下类型不同
type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error)
InGetToken第二个参数req的类型为*AuthData,而 inUnaryHandler req的类型为interface{}。返回的*Token类型与 不同interface{}。这就是为什么不能GetToken直接传递给拦截器的原因。
在你的 grpc 服务中,你可以编写类似的方法
GetToken(ctx context.Context, req *AuthData) (*Token, error)
作为处理程序来完成您的服务器工作。然而,它并不UnaryHandler像人们想象的那样。
大部分转换是由 grpc/protobuf 代码生成器完成的。根据您的原型定义,它会生成一个接口,如下所示:
type XXXServer interface {
GetToken(ctx context.Context, req *AuthData) (*Token, error)
}
您可以看到您的处理程序满足的是这个接口(而不是 UnaryHander)。
在幕后,如果您查看xxx.pb.go生成的文件,您会发现一些_XXX_GetToken_Handler文件实际上正在执行处理程序工作。在此函数中,(实际)UnaryHandler被定义为:
func _XXX_GetToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
// skip other preparations...
//
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(XXXServer).GetToken(ctx, req.(*AuthData))
}
return interceptor(ctx, in, info, handler)
}
在 this 内部UnaryHandler,它将把您的服务器转换为接口XXXServer,然后调用您的处理程序(您的代码)。这显示了如何interceptor调用它。
- 1 回答
- 0 关注
- 109 浏览
添加回答
举报