Как поддержать запрос на обновление патча с помощью 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 здесь.

Обратите внимание, что его также можно использовать для фильтрации ответов, если клиенту не нужен весь объект.

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