単純なGRPCサーバーと、サーバーを呼び出すクライアント(両方ともGo)を作成しました。 golang/protobuf/structを使用することがGRPCでダイナミックJSONを送信する最良の方法であるかどうかを教えてください。以下の例では、以前にmap [string] interface {}としてDetailsを作成し、それをシリアル化していました。次に、protoMessageでバイトとして送信し、サーバー側でメッセージをデシリアライズしていました。
それはそれを行うための最良/効率的な方法ですか、またはプロトファイルの構造体として詳細を定義する必要がありますか?
以下は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)
}
JSONデータが既にある場合は、文字列フィールドとしてエンコードすることもできます。それ以外の場合、google.protobuf.Structを使用することは非常に合理的であり、クライアントとサーバーでStructとJSONを簡単に変換するために jsonpb を使用できるはずです。