使用Google Drive API更新权限时出现500错误

时间:2015-05-04 09:53:41

标签: google-api google-drive-api google-api-client

当我尝试授予任何文件的访问权限时,我收到500错误。当文件与某人共享时,我不想发送电子邮件。我想停止通知电子邮件。

  Insert insert = service.permissions().insert(fileId, newPerm);
  insert.setSendNotificationEmails(false);
  newPerm = insert.execute();


        500 OK
            {
            "code" : 500,
            "errors" : [ {
            "domain" : "global",
            "message" : "Internal Error. User message: \"An internal                                                     error has occurred which prevented the sharing of these item(s): fileame\"",
           "reason" : "internalError"
            } ],
          "message" : "Internal Error. User message: \"An internal error has occurred which prevented the sharing of these item(s): filename\""
            }

感谢任何建议。

3 个答案:

答案 0 :(得分:5)

我开始遇到此问题,但设法通过在文件推送和权限插入之间引入暂停来解决此问题。

我的工作流程' (使用http帖子而不是休息客户端):

  1. 推送文件。
  2. 从Google云端硬盘API获取 fileId
  3. 使用 fileId
  4. 发送有效负载以插入权限

    我总是得到500'内部错误'在第3步;该文件始终被成功推送。

    在我的初步调试中,当您单步调试时,我会尝试再将相同的文件推送给Google,并且它会返回与以前尝试使用相同文件相同的fileId(因此Google Drive API必须重新认识文件是一样的。)

    但是当我尝试使用相同的fileId插入(仍在调试)后续权限时,它始终是成功的。

    所以我刚刚在文件推送和权限插入之间引入了 20s暂停 ,这已经成功了(因为时间在我的应用程序中并不重要)。

    Google云端硬盘必须存在某种复制延迟(或#time; time_til_permissions_can_be_inserted')。难以置信,看作是谷歌,但是嘿。

答案 1 :(得分:5)

在这个问题的another answer中,@ eversMcc有正确的想法:暂停一下。该错误是由于Google云端硬盘正忙于处理该文件(创建该文件,将其推送到全局可访问或以其他方式更新)。一旦活动一蹴而就,那么在文档中添加其他用户不应该是一个问题。

您可以从this Drive API documentation page看到您收到的(500)错误的描述以及实施指数退避的建议行动方案,这实际上只是说您应该再次尝试之前暂停一下&安培;每次出现相同的错误时延长延迟。

虽然@eversMcc实现了20秒暂停,但您不必使用固定的退避持续时间,因此为什么指数是有用的。为什么只有4或8才能等待20秒?另一个资源是此描述性博客post。如果您不想自己实现它,可以尝试找到类似于这些(基于Python的)retryingbackoff包的内容。如果您想要自己的例子,请查看this related SO Q&A

使用Drive API添加权限或任何与文件相关的操作,例如共享,复制,导入/导出等,但对于任何文档 - 以Sheets电子表格为导向的操作,您将使用Google Sheets API代替。

注1:在此帖之前一年有类似的问题,但根据this SO Q&A修正了。

注意2:Drive API v2的permissions.insert()命令在第3版中将名称更改为permissions.create() - 有关详细信息,请参阅migration guide

答案 2 :(得分:-3)

这很可能是Drive API基础架构中的暂时性错误。有时,您可能会遇到这类行为,这可能是由于Google端部的网络或服务器问题造成的。

不幸的是,关于这类错误的信息非常有限。建议的策略是执行和指数退避,如here所解释的更详细here

在某些(奇怪的)情况下,这个问题的持续时间可能比预期的要长,这对于开发人员来说可能会让人感到沮丧,但最终会在24-48小时内消失,一切都会恢复正常。如果错误持续很长时间,您应该向Drive API支持代理请求跟踪令牌,这将在内部生成可由Engineering进行分析的更多信息。