C# Google SDK 更新或补丁用户
Posted
技术标签:
【中文标题】C# Google SDK 更新或补丁用户【英文标题】:C# Google SDK Update or Patch User 【发布时间】:2021-12-08 16:10:27 【问题描述】:使用 Google Admin SDK for C# 使用更新用户时遇到问题。
https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/update
此方法支持补丁语义,这意味着您只需要包含您希望更新的字段。请求中不存在的字段将被保留,设置为 null 的字段将被清除。
这与补丁不同,因为补丁不会清除为空的字段,而只会更新具有值的字段。
问题是我必须将完整的 Google.Apis.Admin.Directory.directory_v1.Data.User 类传递给函数,该类将包含我不想清除的偶数属性。
示例:
public User UpdateUser(Google.Apis.Admin.Directory.directory_v1.Data.User gUser)
UsersResource.UpdateRequest userUpdateRequest = _service.Users.Update(gUser, gUser.Id);
User updatedUser = userUpdateRequest.Execute();
return updatedUser;
有什么方法可以在UpdateRequest中的Body在执行之前修改一下吗?
编辑: UpdateRequest 具有如下所示的 ModifyRequest 属性 我只是不知道如何使用它,有什么想法吗?
public Action<HttpRequestMessage> ModifyRequest get; set;
【问题讨论】:
您好!我不明白你想同时取消和保存什么样的属性。你能举一些例子吗? 【参考方案1】:至于将事物更新为 Null 的概念,这是 PATCH 无法完成的。我建议将其设置为空字符串。
如果这就是您当前正在做的事情,您也不应该发送完整的用户对象。我将假设您已经完成了users.list 来找到您想要更新的用户并更改该用户的某些内容,说出名称。然后您只需将完整的用户对象提交给您的方法
UpdateUser(Google.Apis.Admin.Directory.directory_v1.Data.User gUser)
这不起作用,因为您作为更新/补丁的一部分发送的某些字段实际上是不可写的。
你应该做的是创建一个新的用户对象来改变你想要的东西
public User MakeUserAdmin(Google.Apis.Admin.Directory.directory_v1.Data.User gUserId)
var updateFields= new Google.Apis.Admin.Directory.directory_v1.Data.User();
change.IsAdmin = true;
change.Addresses = ""; // will set it to empty yes not null but the best you can do with this api.
UsersResource.UpdateRequest userUpdateRequest = _service.Users.Update(updateFields, gUserId);
User updatedUser = userUpdateRequest.Execute();
return updatedUser;
注意您只需要创建一个新对象并仅更新您需要的字段然后发送。
不要尝试更新每个字段,只需更新您知道已更改的字段。也不要在不可写的对象中包含 id。
【讨论】:
我已经向 google 的某个人发送了 ping。据我所知,PATCH 无法将其设置为空。但以防万一我认为我应该仔细检查一下,也许谷歌有他们没有记录的解决方法。 您编写的这段代码将清除用户的每个属性,因为它正在使用更新端点,因为创建一个新的用户类将启动每个属性为空。正如端点文档所说; “设置为空的字段将被清除。”在 Patch 上使用上述代码会起作用,但将属性设置为空字符串与清除它不同。宁愿清除它而不是向它写入一个空字符串。 同样在调用这个方法时,我只有 ID 和已更改的属性。因为我宁愿不做一个新的 api 调用只是为了获取完整的用户对象,但如果没有其他方法,我可能不得不用空字符串做一个补丁或获取完整的用户对象。只是觉得应该有办法做到这一点。例如,Google Clas-s-room API 更新有一个掩码选项来选择要写入的属性。 最终将值设置为空字符串而不是 null 我之前在使用补丁的所有 Google api 上都遇到过同样的问题。在布尔值的情况下,我唯一能想到的是将值设置为空字符串或 false。以上是关于C# Google SDK 更新或补丁用户的主要内容,如果未能解决你的问题,请参考以下文章
Android:使用补丁文件更新 google play store 上的现有应用程序
无法从 C# 中的 google api 令牌验证器获取数据