gRPC和Swagger注释的区别

时间:2018-11-13 08:14:52

标签: go swagger protocol-buffers grpc-gateway

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

message Timestamp {
  int64 seconds = 1;
  int32 nanos = 2;
}

因此,gRPC有效负载以预期的简单元组形式出现。但是我也想为同一条消息为REST API生成一些醒目的注解,但似乎将Timestamp转换为RFC 3339样式字符串:

"timestamp": {
  "type": "string",
  "format": "date-time",
  "title": "timestamp"
}

我最近开始使用协议缓冲区和gRPC,因此我不确定在这里是否缺少某些内容,但这似乎与grpc-gateway实现不一致。为什么REST与gRPC有效负载会采用不同的格式?还是我错过了某种告诉protoc-gen-swagger不将消息转换为字符串的方法?

1 个答案:

答案 0 :(得分:1)

我对protoc-gen-swagger本身并不熟悉,但是我相信这是由于这里定义的json-proto格式而发生的:

https://developers.google.com/protocol-buffers/docs/proto3#json

通过这种方式可以使基于JSON的API更“自然”。 除了使用您自己的类型而不是google.protobuf.Timestamp来保存时间戳之外,我不知道有什么方法可以避免这种情况。但是,预计JSON转换可以在两个方向上正常工作,因此当库将JSON转换回原始消息时,它不会造成任何问题。