Python 当使用FieldMask时,HTTP修补程序应该如何通信资源属性的删除
TL,DR;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; } //更新方法的请求消息。 消息更新搜
测试资源的示例:
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
资源未提供值,则应使用删除它
这需要手动访问掩码中的每个字段或测试消息(或两者都),以确定是否应删除该字段。这似乎很疯狂,尤其是当一个资源有许多字段时