Различия аннотаций gRPC и Swagger
У меня есть определение буфера протокола, которое включает в себя google.protobuf.Timestamp
как часть сообщения. Сообщение Timestamp довольно простое и имеет следующее определение:
message Timestamp {
int64 seconds = 1;
int32 nanos = 2;
}
Таким образом, полезная нагрузка gRPC выглядит как простой набор значений, как и ожидалось. Однако я также хотел сгенерировать некоторые аннотации для REST API для того же сообщения, но, похоже, он преобразовал метку времени в строку стиля RFC 3339:
"timestamp": {
"type": "string",
"format": "date-time",
"title": "timestamp"
}
Недавно я начал работать с буферами протокола и gRPC, поэтому я не уверен, что мне здесь чего-то не хватает, но, похоже, это противоречит реализации grpc-gateway. Почему REST был бы другим форматом, чем полезная нагрузка gRPC? Или я упускаю какой-то способ сказать protoc-gen-swagger не преобразовывать сообщение в строку?
1 ответ
Я не очень знаком с самим protoc-gen-swagger, но я полагаю, что это происходит из-за формата json-proto, определенного здесь:
https://developers.google.com/protocol-buffers/docs/proto3
Это сделано таким образом, чтобы сделать его более "естественным" для API на основе JSON. Я не знаю ни одного способа избежать этого, кроме как использовать свой собственный тип для хранения временной метки вместо google.protobuf.Timestamp
, Однако ожидается, что преобразование JSON будет работать правильно в обоих направлениях, поэтому, когда библиотека преобразует JSON обратно в прототип сообщения, это не должно вызывать никаких проблем.