Конечные точки Google Cloud: перекодирование сообщений с помощью protobuf. Любые поля - PullRequest
0 голосов
/ 12 июня 2018

У меня есть служба grpc, которая принимает в качестве входных данных сообщение, содержащее поля типа protobuf.Any, и я не могу найти способ написать правильный ввод JSON для него.Я работаю на GKE, с конечной точкой облака ESP и моим сервисом, работающим в одном модуле.

Прототипы выглядят так:

message AnyArray {
    repeated google.protobuf.Any value = 1;
}
message Metric {
    string metric = 1;
    int64 timestamp = 2;
    double value = 3;
    map<string, AnyArray> metadata = 4;
}

Я пробовал несколько комбинаций для входного json безК счастью, в большинстве случаев возвращаются конечные точки облака: «Прото-поле не повторяется, не может быть начальный список».Неудачные примеры:

{
    "metadata": {
        "sample-key": {
            "value": [1, "one"]
        }
    },
    "metric": "request-count",
    "timestamp": 1528425789,
    "value": 0
}

{
    "metadata": {
        "sample-key": {
            "value": [{
                "@type": "type.googleapis.com/google.protobuf.Duration",
                "value": "1.212s"
            }, {
                "@type": "type.googleapis.com/google.protobuf.Duration",
                "value": "1.212s"
            }]
        }
    },
    "metric": "request-count",
    "timestamp": 1528425789,
    "value": 0
}

Ответ от ESP

{
    "code": 3,
    "message": "metadata[0].value: Proto field is not repeating, cannot start list.",
    "details": [{
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "stackEntries": [],
        "detail": "internal"
    }]
}

Любая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Использование protobuf.Struct вместо protobuf. Любая решила мою проблему, как рекомендовано @lizan.Спасибо!

0 голосов
/ 12 июня 2018

google.protobuf.Any означает любой тип прото-сообщения , поэтому ваш первый пример не работает.Для второго примера google.protobuf.Duration имеет специальное сопоставление JSON, поэтому должен работать следующий пример:

{
    "metadata": {
        "sample-key": {
            "value": [{
                "@type": "type.googleapis.com/google.protobuf.Duration",
                "value": "1.212s"
            }, {
                "@type": "type.googleapis.com/google.protobuf.Duration",
                "value": "1.212s"
            }]
        }
    },
    "metric": "request-count",
    "timestamp": 1528425789,
    "value": 0
}

Обратите внимание, что вы должны будете включить все возможные типы сообщений прото для google.protobuf.Any в наборе протокольных дескрипторов, предоставляемых службой Cloud Endpoints, в противном случае он не сможет переводить неизвестные типы.

Другой возможный подход - использование google.protobuf.Struct для ваших метаданных, которое исключаетуказанное выше ограничение, но вам придется преобразовать его в ожидаемые типы в службе gRPC.

...