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 上的现有应用程序

Google登录和支付

在 C# 中与 Google Admin SDK 集成

无法从 C# 中的 google api 令牌验证器获取数据

无法使用 Google Directory API Admin SDK 列出用户

后续更新 | 减少使用非 SDK 接口以提升稳定性