I've been struggling with passing a JSON with Message values back and forth
between a browser (grpc-web) and server (python grpc). A Struct seems to be
the way but even though the struct I'm sending looks perfectly fine, it is
empty once received by the server.
```
// 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 (js in browser using grpc-web)
struct = new proto.google.protobuf.Struct(obj);
req = new Request;
req.variables = struct;
```
Checking `req.variables` before sending shows that it's indeed a `Struct`
with all the correct fields in it. But once the other end (server) receives
it `req.variables` is an empty `Struct`. For testing purposes I tried an
`obj` that is simply `{'key': 'value'}`, but the result was the same.
Next thing I tried was `proto.google.protobuf.Struct.fromJavaScript`:
```
// code
struct = proto.google.protobuf.Struct.fromJavaScript(vars);
req = new Request;
req.variables = struct;
```
This works for a simple `obj` (e.g. `{"key": "val"}`), but for an `obj`
with a proto message field (such as above) it resulted in :
```
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)
```
Or should I, instead of going through all the troubles with protobuf/json
in javascript, just use a `map`? The nesting in my case will only be 1
level deep anyway. But the values may be anything (proto.MessageX, string,
boolean, etc):
```
// proto
message Request {
map<string, ?type?> variables = 1;
}
```
One advantage is that the receiving end knows all the proto definitions it
might receive. But what would `?typ?` be?
I would really like to use proto messages in variables. The reason for
picking protobuf/grpc was exactly this, being able to use the same type
throughout our complete platform, but this seems to be blocking this goal.
Did I miss something? What would you do?
I've also asked this on StackOverflow:
https://stackoverflow.com/questions/62693938/grpc-passing-json-with-proto-message-field-between-browser-and-server
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/protobuf/03aca5e1-60c5-4610-9f0b-0b9e127374d9o%40googlegroups.com.