Как поддержать запрос на обновление патча с помощью protobuf 3
У нас часто бывают случаи, когда мы хотим обновить только подмножество полей ресурса. Так что, если у нас есть ресурс Person
:
type Person struct {
Age int
Name string
Otherfield string
}
Скажем, вызывающий клиент хочет только обновить Age
поле. Как бы обычно была настроена конечная точка для обработки этого?
Я считаю, что это должно быть сделано с PATCH
запрос, с только полями, установленными как часть полезной нагрузки, то есть:
{
Age: 21
}
Тем не менее, это не будет работать с proto3, потому что, насколько я знаю, нет пустых полей, только значения по умолчанию. Это не будет работать во многих случаях, когда значение по умолчанию является действительным.
1 ответ
Глядя на собственные файлы Protobuf Google (например, здесь), они используют FieldMask для частичного обновления.
Объект FieldMask передается вместе с запросом и имеет форму (в JSON):
{
mask: "Person.Age"
}
Это позволяет клиенту сообщать серверу, какие поля он хочет обновить, не рассчитывая на частичное сообщение, чтобы выяснить это.
Я думаю, что это добавляет ненужную сложность (каждому!) Клиенту, но мы не могли найти другого способа добиться частичного обновления с proto3.
Вы можете увидеть полную документацию по FieldMask здесь.
Обратите внимание, что его также можно использовать для фильтрации ответов, если клиенту не нужен весь объект.