Python 当使用FieldMask时,HTTP修补程序应该如何通信资源属性的删除

Python 当使用FieldMask时,HTTP修补程序应该如何通信资源属性的删除,python,protocol-buffers,proto,http-patch,grpc-python,Python,Protocol Buffers,Proto,Http Patch,Grpc Python,TL,DR;HTTP修补程序在使用时应该如何通信资源属性的删除 谷歌的实施计划规定,应该使用。下面是我自己设计的更新测试资源的示例: name: "Updated" description { value: "I am Original!" } 服务的API为部分更新定义了一个测试资源和一个方法(UpdateTest) //测试资源。 消息测试{ 字符串名称=1; google.protobuf.StringValue description=2; } //更新方法的请求消息。 消息更新搜

TL,DR;HTTP修补程序在使用时应该如何通信资源属性的删除

谷歌的实施计划规定,应该使用。下面是我自己设计的更新
测试
资源的示例:

name: "Updated"
description {
  value: "I am Original!"
}
服务的API为部分更新定义了一个
测试
资源和一个方法(
UpdateTest

//测试资源。
消息测试{
字符串名称=1;
google.protobuf.StringValue description=2;
}
//更新方法的请求消息。
消息更新搜索{
//要更新的测试的资源名称。
字符串名称=1;
//将实际数据包装到数据字段中。
试验=2;
//支持部分更新的字段掩码。
google.protobuf.FieldMask update_mask=3;
}
//部分更新测试资源。
rpc UpdateTest(UpdateTestRequest)返回(google.protobuf.Empty){
选项(google.api.http)={
修补程序:“v1/{name=tests/*}”
正文:“*”
};
}
同样精心设计的服务器实现使用来合并资源(proto消息):

updated\u test=v1\u test\u pb2.test(名称='updated')
原始测试=v1\u测试\u pb2.test(
名称='原始',
description=google.protobuf.wrappers_pb2.StringValue(
值='我是原创的!')
)
mask=google.protobuf.field\u mask\u pb2.FieldMask(
路径=['name','description']
)
#从,到
mask.MergeMessage(更新的\u测试、原始\u测试)
打印(更新的测试)
最终结果是一个补丁
测试
资源:

name: "Updated"
description {
  value: "I am Original!"
}
清除
description
字段将完全删除该属性:

updated\u test=v1\u test\u pb2.test(名称='updated')
更新的\u test.ClearField('说明')
原始测试=v1\u测试\u pb2.test(
名称='原始',
description=google.protobuf.wrappers_pb2.StringValue(
值='我是原创的!')
)
#从,到
mask.MergeMessage(更新的\u测试、原始\u测试)
打印(更新的测试)
…最终修补的
测试
资源将是:

name: "Updated"
太好了。但是,在HTTP补丁请求中如何对其进行编码呢

我能想到的唯一“解决方案”是,如果包含
description
但更新的
Test
资源未提供值,则应使用删除它

这需要手动访问掩码中的每个字段或
测试
消息(或两者都),以确定是否应删除该字段。这似乎很疯狂,尤其是当一个资源有许多字段时