如何区分Google Calendar的不同Watch事件?POST为空问题
如何区分Google Calendar Watch事件的不同操作(创建/删除)
1. 借助X-Goog-Resource-State字段判断基础状态
请求头中的X-Goog-Resource-State字段直接标识了资源的当前状态:
not_exists:对应事件删除操作exists:对应事件创建或更新操作
不过这个字段无法区分创建和更新,需要结合后续步骤进一步验证。
2. 主动拉取资源变更详情
Google推送通知仅作为事件变更的触发信号,不会携带具体变更内容。你可以通过以下方式获取具体操作类型:
- 提取请求头中的
X-Goog-Resource-Uri,调用Calendar API拉取该日历的事件列表 - 记录每次推送的
X-Goog-Message-Number和上次同步的时间戳,通过updatedMin参数过滤出最新变更的事件 - 对比本地存储的事件数据,即可区分是新增还是更新操作
示例PHP代码(拉取最新变更事件):
// 假设已初始化授权后的Google Calendar客户端$calendar $lastSyncTime = '2024-05-20T00:00:00Z'; // 本地记录的上次同步时间 $response = $calendar->events->listEvents('primary', [ 'updatedMin' => $lastSyncTime, 'orderBy' => 'updated', 'maxResults' => 20 ]); $updatedEvents = $response->getItems(); // 对比本地事件列表,找出新增/更新的事件项
3. 自定义Channel-Id区分多监听场景
如果同时监听多个日历或不同类型的事件,创建Watch时可以设置唯一的Channel-Id:
$channel->setId('primary-calendar-event-watch-001'); // 自定义唯一标识 $channel->setAddress('https://xxxx/handle.php'); $watchEvent = $calendar->events->watch('primary', $channel);
触发通知时,通过请求头的X-Goog-Channel-Id即可区分是哪个监听任务的通知,再结合X-Goog-Resource-State判断具体操作类型。
内容的提问来源于stack exchange,提问作者Taylan Karaman
相关产品推荐
相关产品推荐

