我一直在努力在系统之间来回传递带有 Message 值的 JSON。走得更远了,但我还是不在。A Struct 似乎是一种方式,但即使我发送的结构看起来非常好,一旦被服务器接收到它就是空的。
Result
从 Web 浏览器 (grpc-web) 传递到 Python 后端。Python 后端应该序列化为Result
JSON(以存储它)并再次返回。
// proto
message Result {
google.protobuf.Struct variables = 1;
}
// obj - Where variables would contain a (1 level deep) JSON with different types of values, e.g.:
{
"key1": 1,
"key2": true,
"key3": proto_msg_a //instance of proto.MessageA
}
// code
struct = new proto.google.protobuf.Struct(obj);
req = new Request;
req.variables = struct;
发送前检查req.variables
表明它确实是 a Struct
,其中包含所有正确的字段。但是一旦另一端(服务器)收到它req.variables
就是一个空的Struct
. 出于测试目的,我尝试了obj
that is simple {'key': 'value'}
,但结果是一样的。
所以我尝试了proto.google.protobuf.Struct.fromJavaScript
:
// code
struct = proto.google.protobuf.Struct.fromJavaScript(vars);
req = new Request;
req.variables = struct;
这适用于简单的obj
(例如{"key": "val"}
),但对于obj
带有原始消息字段(例如上面)的它会导致:
struct_pb.js:875 Uncaught Error: Unexpected struct type.
at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:875)
at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
或者我可以不用在 javascript 中使用 protobuf/json 来解决所有麻烦,而只需使用map
?
// proto
message Request {
map<string, ?type?> variables = 1;
}
但是,?type?
如果值可以是任何东西(proto.MessageX、字符串、布尔值等),那会是什么?
我真的很想在变量中使用原始消息。选择 protobuf/grpc 的原因正是这个,能够在我们的整个平台上使用相同的类型,但这似乎阻碍了这个目标。我错过了什么?你会怎么做?