2017-06-13 52 views
2

我们经常遇到用例,我们只想更新资源上的子集字段。因此,如果我们有一个资源Person如何使用protobuf支持补丁休息请求3

type Person struct { 
    Age int 
    Name string 
    Otherfield string 
} 

说调用客户端只想要更新Age领域。通常如何设置终端来处理这个问题?

我相信这应该有PATCH请求来实现的,只有场被设置为有效载荷的一部分,即:

{ 
    Age: 21 
} 

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

+1

答案可能与此处相同:use proto2 https://stackoverflow.com/questions/37433955/proto3-setting-value-equal-to-default-is-not-recognised-in-runtime?rq=1 – jpa

回答

1

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

FieldMask对象与请求一起传递,并且具有(在JSON)的形式为:

{ 
    mask: "Person.Age" 
} 

这允许客户端告知哪些字段他们希望更新的服务器,而不对部分消息计数本身来解决这个问题。

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

您可以看到FieldMask here的完整文档。

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