Различия аннотаций 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 обратно в прототип сообщения, это не должно вызывать никаких проблем.

Другие вопросы по тегам