如何在 gRPC Protobuf 中为接口创建类型?

How to create type for interface in gRPC Protobuf?

我们为所有微服务提供通用的身份验证服务。 当我们验证响应请求时,我们发送 JSON 看起来像这样。

{
    Auth: bool,
    Body: interface{}
}

在写proto3语法的时候,怎么写类似接口类型的东西呢?

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

用于响应的原型消息

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

有人可以帮忙吗?

您可以将 body 类型设置为 bytes

如果您的 body 可能是 pre-defined 类型集,那么我建议您将 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

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

希望对您有所帮助!