Я написал простой сервер GRPC и клиент для вызова сервера (оба в Go).Скажите, пожалуйста, лучше ли использовать golang / protobuf / struct для отправки динамического JSON с GRPC.В приведенном ниже примере ранее я создавал Details в виде интерфейса map [string] {} и сериализовал его.Затем я отправлял его в protoMessage в виде байтов и десериализовал сообщение на стороне сервера.
Это лучший / эффективный способ сделать это, или я должен определить 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 ("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)
}