程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了将 gRPC 拦截器中的请求转换为相关的 protobuf 消息大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决将 gRPC 拦截器中的请求转换为相关的 protobuf 消息?

开发过程中遇到将 gRPC 拦截器中的请求转换为相关的 protobuf 消息的问题如何解决?下面主要结合日常开发的经验,给出你关于将 gRPC 拦截器中的请求转换为相关的 protobuf 消息的解决方法建议,希望对你解决将 gRPC 拦截器中的请求转换为相关的 protobuf 消息有所启发或帮助;

我有一个 UnaryServerInterceptor 接收 req Interface{}。此 req 可以是我的任何一条消息,但在这种情况下,我的所有消息都有一个共同的 @H_433_3@metadata 子消息。

Protobuf 定义(示例)

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)
    }
}

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

解决这个问题的最佳方法是什么?

解决方法

protoc 代应该为这两种类型生成一个名为 GetMetadata 的方法。您可以使用类型断言检查传入消息是否实现了接口(有关详细信息,请参阅tour of go),然后调用该方法以获取元数据。

type HasMetadata interface {
    GetMetadata() *ClientMeta
}

在处理消息的函数中,做这样的事情

if m,ok := req.(HasMetadata); ok {
    return m.GetMetadata()
}

大佬总结

以上是大佬教程为你收集整理的将 gRPC 拦截器中的请求转换为相关的 protobuf 消息全部内容,希望文章能够帮你解决将 gRPC 拦截器中的请求转换为相关的 protobuf 消息所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。