谷歌硬盘推送通知-一次更改事件可点击多次



我正在尝试设置Google Drive推送通知来监控对文件夹的更改。

代码:

    $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.

问题是,我会收到一个变更事件的多个通知,而且每次都会在更长的时间后到达(与"指数退避"行为相匹配)。同时,Changes资源的maxChangeIdCount不递增。

因此,谷歌驱动器推送者似乎没有看到成功的200代码,并重试通知。当然,这带来了一个巨大的问题——很难核实变化是否确实发生了。

因此,问题是:

  • 对通知的正确响应是什么?是字符串"200"还是没有响应体的HTTP响应代码200
  • 我如何才能保证在监视的文件更改时始终只有一个通知更新

谢谢!

  • 对通知的正确响应是什么?是字符串"200"还是没有响应体的HTTP响应代码200

它是一个200 HTTP响应代码:响应可以是一个空体

  • 如何保证在监视的文件更改时始终只有一个通知更新

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

你能做什么:

  • 您可以确保发送200 http的响应代码
  • 根据你的代码的结构,如果你能确保只有一个频道是打开的,那么谷歌只会向你发送一个通知,也就是说,只有在前一个频道过期的情况下才创建一个新频道

最新更新