Как создать тип для интерфейса в gRP C Protobuf? - PullRequest
0 голосов
/ 14 февраля 2020

У нас есть общий сервис аутентификации для всех микросервисов. Когда мы проверяем запрос в ответ, мы отправляем JSON, который выглядит следующим образом.

{
    Auth: bool,
    Body: interface{}
}

При написании синтаксиса proto3, как мы можем написать что-то вроде типа интерфейса?

Я пытался используя любой тип, но я не могу использовать его, так как нам нужно передать тип сообщения в типе URL, который я не могу сгенерировать.

Прото-сообщение для ответа

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

Может кто-нибудь помочь здесь?

1 Ответ

2 голосов
/ 14 февраля 2020

Вы можете установить тип 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

В этом сценарии, однако, вам может потребоваться использовать магию отражения c, чтобы закодировать его в какой-то байт. Вы можете даже использовать JSON.

Надеюсь, это поможет!

...