如何在 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
.
希望对您有所帮助!
我们为所有微服务提供通用的身份验证服务。 当我们验证响应请求时,我们发送 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
.
希望对您有所帮助!