Google drive api Google驱动器推送通知-单个更改事件的多次点击

Google drive api Google驱动器推送通知-单个更改事件的多次点击,google-drive-api,Google Drive Api,我正在尝试设置Google驱动器推送通知,以监视对文件夹的更改 守则: $channel = new \Google_Service_Drive_Channel; $channel->setId('ZZZ'); $channel->setResourceId('a1b2c3'); $channel->setType('web_hook'); $channel->setToken('superToken'); $channel

我正在尝试设置Google驱动器推送通知,以监视对文件夹的更改

守则:

    $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.
问题是,对于一个变更事件,我会收到多个通知,而且它们似乎每次都会在较长时间后到达(与“指数退避”行为相匹配)。同时,maxChangeIdCount的更改资源不会增加

因此,Google Drive pusher似乎没有看到成功的200代码并重试通知。当然,这带来了一个巨大的问题——很难证实这种变化确实发生了

因此,问题是:

  • 对通知的正确响应是什么?是字符串“200”还是没有响应体的HTTP响应代码200
  • 我如何保证当监视的文件更改时,始终只有一个通知更新
谢谢大家!

  • 对通知的正确响应是什么?是字符串“200”还是没有响应体的HTTP响应代码200
它是一个200 HTTP响应代码:响应可以是一个空的主体

  • 我如何保证在监视的文件更改时始终只有一个通知更新
您收到重复通知的原因可能有两个:您没有发送200响应代码(并且没有返回字符串200作为正文),因此Google猜测您没有收到通知,并继续向您发送相同的消息。或者,您可能同时打开了多个频道。如果该代码在一个小时内执行不止一次(或更多,具体取决于google设置的默认过期时间),那么您将创建多个频道,google将通知推送到所有开放频道

您可以做什么:

  • 您可以确保发送的是200 http响应代码
  • 根据代码的结构,如果您可以确保只有一个频道是开放的,那么google只会向您发送一个通知,也就是说,如果前一个频道已过期,则只创建一个新频道

我认为这是谷歌服务器的不当行为。我在使用drivev3api时也遇到同样的问题。作为解决方法,我只是忽略了基于resourceUri头属性的pageToken参数的重复项。