У меня написан простой сервер GRPC и клиент для вызова сервера (оба на Go). Скажите, пожалуйста, является ли использование golang/protobuf/struct лучшим способом отправки динамического JSON с помощью GRPC. В приведенном ниже примере ранее я создавал Details
как map[string]interface{}
и сериализовал его. Затем я отправлял его в protoMessage как bytes
и десериализовал сообщение на стороне сервера.
Это лучший/эффективный способ сделать это или я должен определить Details как структуру в моем прото-файле?
Ниже приведен файл User.proto.
syntax = "proto3";
package messages;
import "google/protobuf/struct.proto";
service UserService {
rpc SendJson (SendJsonRequest) returns (SendJsonResponse) {}
}
message SendJsonRequest {
string UserID = 1;
google.protobuf.Struct Details = 2;
}
message SendJsonResponse {
string Response = 1;
}
Ниже приведен файл client.go
package main
import (
"context"
"flag"
pb "grpc-test/messages/pb"
"log"
"google.golang.org/grpc"
)
func main() {
var serverAddr = flag.String("server_addr", "localhost:5001", "The server address in the format of host:port")
opts := []grpc.DialOption{grpc.WithInsecure()}
conn, err := grpc.Dial(*serverAddr, opts...)
if err != nil {
log.Fatalf("did not connect: %s", err)
}
defer conn.Close()
userClient := pb.NewUserServiceClient(conn)
ctx := context.Background()
sendJson(userClient, ctx)
}
func sendJson(userClient pb.UserServiceClient, ctx context.Context) {
var item = &structpb.Struct{
Fields: map[string]*structpb.Value{
"name": &structpb.Value{
Kind: &structpb.Value_StringValue{
StringValue: "Anuj",
},
},
"age": &structpb.Value{
Kind: &structpb.Value_StringValue{
StringValue: "Anuj",
},
},
},
}
userGetRequest := &pb.SendJsonRequest{
UserID: "A123",
Details: item,
}
res, err := userClient.SendJson(ctx, userGetRequest)
}