1 回答

TA貢獻(xiàn)1842條經(jīng)驗 獲得超21個贊
不,函數(shù)
GetToken(ctx context.Context, req *AuthData) (*Token, error)
與以下類型不同
type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error)
InGetToken第二個參數(shù)req的類型為*AuthData,而 inUnaryHandler req的類型為interface{}。返回的*Token類型與 不同interface{}。這就是為什么不能GetToken直接傳遞給攔截器的原因。
在你的 grpc 服務(wù)中,你可以編寫類似的方法
GetToken(ctx context.Context, req *AuthData) (*Token, error)
作為處理程序來完成您的服務(wù)器工作。然而,它并不UnaryHandler像人們想象的那樣。
大部分轉(zhuǎn)換是由 grpc/protobuf 代碼生成器完成的。根據(jù)您的原型定義,它會生成一個接口,如下所示:
type XXXServer interface {
GetToken(ctx context.Context, req *AuthData) (*Token, error)
}
您可以看到您的處理程序滿足的是這個接口(而不是 UnaryHander)。
在幕后,如果您查看xxx.pb.go生成的文件,您會發(fā)現(xiàn)一些_XXX_GetToken_Handler文件實際上正在執(zhí)行處理程序工作。在此函數(shù)中,(實際)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 內(nèi)部UnaryHandler,它將把您的服務(wù)器轉(zhuǎn)換為接口XXXServer,然后調(diào)用您的處理程序(您的代碼)。這顯示了如何interceptor調(diào)用它。
- 1 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報