web-dev-qa-db-fra.com

"Google / protobuf / struct.proto" est-il le meilleur moyen d'envoyer du JSON dynamique sur GRPC?

J'ai écrit un simple serveur GRPC et un client pour appeler le serveur (les deux dans Go). Veuillez me dire si l'utilisation de golang/protobuf/struct est la meilleure façon d'envoyer un JSON dynamique avec GRPC. Dans l'exemple ci-dessous, plus tôt, je créais Détails en tant qu'interface de carte [chaîne] {} et le sérialisais. Ensuite, je l'envoyais dans protoMessage sous forme d'octets et désérialisais le message côté serveur.

Est-ce la meilleure façon/efficace de le faire ou dois-je définir les détails comme une structure dans mon fichier proto?

Ci-dessous le fichier 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;
}

Vous trouverez ci-dessous l'importation principale du package de fichiers 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)
}
6
Anuj Gupta

Si vous disposez déjà de données JSON, vous pouvez également choisir de les coder en tant que champ de chaîne. Sinon, l'utilisation d'un google.protobuf.Struct semble assez raisonnable, et vous devriez pouvoir utiliser jsonpb pour convertir facilement entre Struct et JSON sur le client et le serveur.

1
Doug Fawley