将 gRPC 拦截器中的请求转换为相关的原始语音消息

我有一个收到.这可能是我的任何一条消息,但在这种情况下,我的所有消息都有一个共同的子消息。UnaryServerInterceptorreqInterface{}reqmetadata


原型定义(示例)


message ClientMeta {

    string info = 1;

}


message PingRequest {

    ClientMeta metadata = 1;

}


message OtherRequest {

    ClientMeta metadata = 1;

}


service Blah {

    rpc Ping (PingRequest) returns (PingResponse) {}

    rpc Other (OtherRequest) returns (OtherResponses) {}

}

拦截 器


func (i *authInterceptor) unary() grpc.UnaryServerInterceptor {

    return func(

        ctx context.Context,

        req interface{},

        info *grpc.UnaryServerInfo,

        handler grpc.UnaryHandler,

    ) (interface{}, error) {

        log.Info().Msgf("interceptor: %s", info.FullMethod)

    }

}

我需要访问拦截器中消息的属性。问题是我不知道它是哪个信息,所以我不能只是投射它。我有几个不同的消息,但它们都有共同点。metadatametadata


最好的方法是什么?


胡说叔叔
浏览 64回答 1
1回答

largeQ

这一代人应该已经产生了一个同时调用这两种类型的方法。您可以检查传入消息是否使用类型断言实现接口(有关更多详细信息,请参阅 go 教程),然后调用该方法来获取元数据。protocGetMetadatatype HasMetadata interface {    GetMetadata() *ClientMeta}在处理消息的函数中,执行类似如下操作if m, ok := req.(HasMetadata); ok {    return m.GetMetadata()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go