Является ли "google / protobuf / struct.proto" лучшим способом отправки динамического JSON через GRPC? - PullRequest
0 голосов
/ 24 октября 2018

Я написал простой сервер 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)
}

1 Ответ

0 голосов
/ 01 ноября 2018

Если у вас уже есть данные JSON, вы также можете выбрать их кодирование в виде строкового поля.В противном случае использование google.protobuf.Struct кажется довольно разумным, и вы сможете использовать jsonpb для простого преобразования между Struct и JSON на клиенте и сервере.

...