Google Drive Push Notifications - 单个更改事件的多次点击

Posted

技术标签:

【中文标题】Google Drive Push Notifications - 单个更改事件的多次点击【英文标题】:Google Drive Push Notifications - multiple hits for a single change event 【发布时间】:2014-09-07 01:29:33 【问题描述】:

我正在尝试设置 Google Drive Push Notifications 来监控文件夹的更改。

代码:

    $channel = new \Google_Service_Drive_Channel;
    $channel->setId('ZZZ');
    $channel->setResourceId('a1b2c3');
    $channel->setType('web_hook');
    $channel->setToken('superToken');
    $channel->setAddress('https://mydomain/notification');
    $folderId = '0BzNPrO3YVvJKU1J6NklYcThFMjQ';
    $res = $service->files->watch($folderId, $channel);

$res 包含确认信息,一旦我将文件上传到该文件夹​​中,我确实会收到通知(也可以接收到“同步”信号)。

收到更改通知后,我会回显“200”字符串,正如 Google Drive API 参考中建议的那样:

To indicate success, you can return any of the following status codes: 200, 201, 202, 204, or 102.
If your service returns 500, 502, 503, or 504, the Drive API will retry with exponential backoff.

问题是我收到了针对单个更改事件的多个通知,并且它们似乎每次都在较长时间后到达(与“指数退避”行为相匹配)。同时,ma​​xChangeIdCount 的 Changes 资源不会增加。

所以 Google Drive 推送器似乎没有看到成功的 200 代码并重试通知。当然,这带来了一个巨大的问题——很难验证变化是否确实发生了。

所以,问题是:

什么是对通知的正确响应 - 是字符串“200”还是没有响应正文的 HTTP 响应代码 200 我如何保证当观看的文件发生更改时,始终只有一个通知更新。

谢谢!

【问题讨论】:

我认为这是谷歌服务器的不当行为。我在使用 Drive v3 API 时遇到了同样的问题。作为解决方法,我只是忽略基于 resourceUri 标头属性的 pageToken 参数的重复项。 【参考方案1】: 什么是对通知的正确响应 - 是字符串“200”还是没有响应正文的 HTTP 响应代码 200

它是一个 200 HTTP 响应代码:响应可以是空的正文

如何保证当被监视的文件发生变化时总是只有一个通知更新

您收到重复通知有 2 个可能的原因:您没有发送 200 响应代码(并且没有返回字符串 200 作为正文),因此 Google 猜测您没有收到通知并继续向您发送相同的通知.或者,您可能同时打开了 1 个以上的频道。如果该代码在一小时内执行了不止一次(或更多取决于谷歌设置的默认到期时间),那么您将创建多个频道并且谷歌正在将通知推送到所有开放频道。

你可以做什么:

您可以确保发送的是 200 http 响应代码 根据您的代码结构,如果您能确保只打开 1 个频道,那么 google 只会向您发送 1 条通知,即只有在前一个频道已过期时才创建新频道

【讨论】:

以上是关于Google Drive Push Notifications - 单个更改事件的多次点击的主要内容,如果未能解决你的问题,请参考以下文章

Google drive webhook 通知请求正文为空

在google drive使用google.colab云服务

Google Drive 范围 drive.file 不足以将应用拥有的文件复制到应用用户的 Google Drive

Google Drive API失败,因为库的google.drive功能不存在

通过 Google Drive API 从本地 CSV 文件创建 Google Drive 电子表格

Drive Builder错误:API Google Drive Spring Boot