Go gRPC和Swagger注释的差异

Go gRPC和Swagger注释的差异,go,swagger,protocol-buffers,grpc-gateway,Go,Swagger,Protocol Buffers,Grpc Gateway,我有一个协议缓冲区定义,它包括google.protobuf.Timestamp作为消息的一部分。时间戳消息非常简单,具有以下定义: 消息时间戳{ int64秒=1; int32纳米=2; } 因此,gRPC有效负载就像预期的那样,是一个简单的值元组。不过,我还想为同一消息的REST API生成一些招摇过市的注释,但它似乎将时间戳转换为RFC 3339样式的字符串: “时间戳”:{ “类型”:“字符串”, “格式”:“日期时间”, “标题”:“时间戳” } 我最近开始使用协议缓冲区和gRPC

我有一个协议缓冲区定义,它包括
google.protobuf.Timestamp
作为消息的一部分。时间戳消息非常简单,具有以下定义:

消息时间戳{
int64秒=1;
int32纳米=2;
}
因此,gRPC有效负载就像预期的那样,是一个简单的值元组。不过,我还想为同一消息的REST API生成一些招摇过市的注释,但它似乎将时间戳转换为RFC 3339样式的字符串:

“时间戳”:{
“类型”:“字符串”,
“格式”:“日期时间”,
“标题”:“时间戳”
}

我最近开始使用协议缓冲区和gRPC,所以我不确定这里是否遗漏了什么,但这似乎与gRPC网关实现不一致。为什么REST与gRPC有效载荷的格式不同?还是我缺少了告诉protoc gen swagger不要将消息转换为字符串的方法

我对protoc gen swagger本身不太熟悉,但我相信这是因为这里定义了json proto格式:

这样做是为了使基于JSON的API更加“自然”。
除了使用您自己的类型来保存时间戳而不是
google.protobuf.timestamp
,我不知道有什么方法可以避免这种情况。但是,JSON转换应该在两个方向上都能正常工作,因此当库将JSON转换回原始消息时,它应该不会引起任何问题。

Hey@DougFawley,你是对的,这似乎就是它的方式。protoc gen swagger中的代码逐字检查“google.protobuf.Timestamp”类型并构建一个字符串。拥有一个一致的rfc3339类型的字符串很好,但是从代码效率的角度来看,它是一个从secs/nanosecs格式来回转换的字符串。但是,不管怎样,在讨论REST和json有效负载时,我要说的是什么——一切都是一个字符串!另一方面,我们的SDK是C++,所以转换回不是那么简单,所以我最终定义了自己的“时间戳”消息,这有帮助。