Я использую клиент-серверную структуру gRPC в одном из своих приложений (распознавание речи). Есть несколько важных вещей, которые я хочу прояснить своими наблюдениями.
1. Как отправляется необязательное поле данных, когда оно не заполняется клиентом?
Давайте посмотрим на этот пример ниже: (предположим, что используется proto3, поэтому все поля по умолчанию необязательны)
service NameStudent {
rpc GetRoll(Student) returns (Details) {}
}
#Student'd details
message Student{
int32 roll = 1;
string name = 2;
string gender = 4;
int32 age = 3;
DOB dateofbirth = 5;
}
#Students Date of Birth
message DOB {
int32 dd = 1;
int32 mm = 2;
int32 yy = 3;
}
#Parent's details
message Parent{
string parent =1;
}
#Students all details (includes student + parent)
message Details {
Student student = 1;
Parent parent = 4;
}
Предположим, что служба принимает (ввод от клиента) некоторые из сведений об учащемся, например, численность, имя и возраст, и возвращает (все) данные об этом учащемся < / сильный>
так что теперь, если вместо отправки всех трех деталей (т.е. рулона, имени и возраста), можно отправить даже одну или две детали и (логически предположить, что) служба работает.
В таких случаях будет ли сервер получать все поля (с пробелами / NULL для пропущенных полей) или клиент не будет отправлять эту пропущенную информацию вообще? (см. ниже представления двоичных данных, отправленных от клиента)
// roll and name filled
// age is left blank
// gender and DOB are always sent blank from client
{
roll: 170012,
name: "John Doe",
age: ,
gender: "",
dateofbirth: {
dd: ,
mm: ,
yy:
}
}
ИЛИ
//only roll and name is sent and rest is just not sent
{
roll: 170012,
name: "John Doe"
}
2. Можно ли подключить одну заглушку для двух сервисов?
Если сервер предлагает 2 службы, и я создаю клиентскую заглушку, смогу ли я подключить 2 канала из одной заглушки к одному и тому же серверу, получая доступ к 2 различным его службам?