我有一个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"
}]
}
非常感谢任何帮助。
谢谢!
答案 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推荐。谢谢!