Это определенно возможно, хотя есть и другие способы сделать это.Вы можете выделить общие поля в одно сообщение, которое включено в каждый из ваших запросов / ответов:
message CommonRequestFields {
string messageId = 1;
string origin = 2;
string correlationId = 3;
int32 sentAt = 4;
string type = 5;
int32 version = 6;
}
Вы можете включить это как формальное поле для каждого типа сообщения запроса, без необходимости зависеть отAny
:
message CreateSessionRequest {
CommonRequestFields common = 1;
Session session = 2;
// ...
}
message DropSessionRequest {
CommonRequestFields common = 1;
string sessionId = 2;
// ...
}
Этот подход имеет несколько преимуществ:
- Легко добавлять общие поля для каждого запроса
- Вы можете обрабатывать каждый запрос общими полямиодинаково на клиенте и сервере
- Идентификаторы и имена полей не влияют на идентификаторы и имена полей, специфичные для запроса
Однако есть некоторые недостатки:
- Вам нужно проверить наличие общих полей, а не прямой доступ к полю
- Для некоторых запросов могут не понадобиться все общие поля, что приводит к увеличению числа сообщений
- Что общегосегодня не может быть обычным явлением через 6 месяцев, так как требования меняются.
Наконец, если вы используете gRPC, вы можете отправлять метаданные вместе с каждым запросом, который находится за пределами тела запроса.Поля метаданных представляют собой пары ключ-значение String (такие же, как заголовки HTTP) и могут подходить, если вы отправляете их для каждого запроса или ответа.Вы даже можете кодировать прототипы как поля заголовка, хотя для этого может потребоваться более сложное использование API.