如何使用 protobuf 3 支持补丁休息请求

Dav*_*ave 5 protocol-buffers proto3

我们经常有我们只想更新资源的子集字段的用例。所以如果我们有一个资源Person

type Person struct {
    Age int
    Name string
    Otherfield string
}
Run Code Online (Sandbox Code Playgroud)

假设调用客户端只想更新该Age字段。通常如何设置端点来处理这个问题?

我相信这应该通过PATCH请求来完成,只有字段被设置为有效负载的一部分,即:

{
    Age: 21
}
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于 proto3,因为据我所知,没有空字段,只有默认值。这在默认值有效的许多情况下不起作用。

dan*_*ars 5

查看 Google 自己的 protobuf 文件(例如此处),他们使用 FieldMask 进行部分更新。

FieldMask 对象随请求一起传递,并具有以下形式(JSON 格式):

{
   mask: "Person.Age"
}
Run Code Online (Sandbox Code Playgroud)

这允许客户端告诉服务器他们希望更新哪些字段,而不需要依赖部分消息本身来解决这个问题。

我认为这给(每个!)客户端增加了不必要的复杂性,但我们找不到任何其他方法来实现 proto3 的部分更新。

您可以在此处查看 FieldMask 的完整文档。

请注意,如果客户端不需要整个对象,它也可用于过滤掉响应。

  • 迟做总比不做好 - FieldMask 不做任何过滤。它只是一个数据结构,允许服务器获取客户端想要更新的字段列表。由服务器使用它来实现部分更新。 (2认同)