Google Cloud Endpoints:使用protobuf.Any字段转换邮件

时间:2018-06-11 22:28:03

标签: google-cloud-endpoints

我有一个grpc服务,它将包含protobuf.Any类型字段的消息作为输入,我无法找到为其编写正确json输入的方法。我在GKE上运行,云端点ESP和我的服务在同一个pod中运行。

原型看起来像:

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尝试了多种组合而没有运气,大多数时候云端点返回&#34; Proto字段不重复,无法启动列表。&#34;失败的例子:

{
    "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 :(得分:0)

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
}

请注意,您必须在提供的Cloud Endpoints服务的proto描述符集中包含 google.protobuf.Any 的所有可能的原型消息类型,否则将无法翻译未知类型。

另一种可能的方法是使用google.protobuf.Struct作为元数据,这消除了上述限制,但您必须将其转换为gRPC服务中的预期类型。

答案 1 :(得分:0)

使用protobuf.Struct代替protobuf.Any解决了我的问题@lizan推荐。谢谢!