go - 如何在 gRPC Protobuf 中创建接口(interface)类型?

标签 go protocol-buffers grpc

我们为所有微服务提供通用的身份验证服务。 当我们验证响应中的请求时,我们发送如下所示的 JSON。

{
    Auth: bool,
    Body: interface{}
}

在编写proto3语法时,我们如何编写类似接口(interface)类型的东西?

我尝试过使用 Any 类型,但我无法使用它,因为我们需要在我无法生成的类型 url 中传递消息类型。

响应的原始消息

message AuthResponse {
    bool Auth = 1;
    google.protobuf.Any Body = 2;
}

有人可以帮忙吗?

最佳答案

您可以将body类型设置为bytes

如果您的正文有一组预定义的类型,那么我建议您将 Auth 结构更改为如下所示:

type AuthResponse struct {
    Auth bool
    Body Encodable
}

// Encodable defines types that can be encoded into a byte slice.
type Encodable interface {
    Encode() []byte
}

然后,在每种类型上实现 Encode() []byte

或者,如果您的 Body 字段可以是任何东西,那么也许有一个类似的解决方案,除了您的 Encode 函数如下所示:

func Encode(interface{}) []byte

但是,在这种情况下,您可能必须使用一些反射魔法才能将其编码为某个字节 slice 。您甚至可以使用 JSON

希望这会有所帮助!

关于go - 如何在 gRPC Protobuf 中创建接口(interface)类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60220640/

相关文章:

angular - 具有 Angular 6 的 GRPC Web 客户端

c++ - gRPC 和 etcd 客户端

sql - 为什么在 gorm 等 go 库中使用 struct 中的 sql 标签?

go - 在 Go 中使用 select 发送到 channel 有什么好处?

file - 无法解析HCL文件中的变量

c - 如何序列化/反序列化 protobuf-c 中的枚举

python - 在tensorflow/models/research(不是/object_dectio)中编译.proto

GO Websocket 向所有客户端发送消息

c# - 如何通过 Protobuf/Protobuf-net 使用某些对象继承的列表/数组?

protocol-buffers - grpc Protobuf 3 嵌套消息定义