5

我们经常有一些用例,我们只想更新资源上的子集字段。因此,如果我们有资源Person

type Person struct {
    Age int
    Name string
    Otherfield string
}

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

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

{
    Age: 21
}

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

4

1 回答 1

4

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

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

{
   mask: "Person.Age"
}

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

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

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

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

于 2017-08-20T10:53:07.970 回答