Google Calendar推送通知请求体为空?问题排查咨询
Google Calendar Webhook推送体为空问题解决
你的当前配置
const response = await calendar.events.watch({ auth: authClient, calendarId: 'primary', requestBody: { id: 'calendar-watch-' + Date.now(), type: 'web_hook', address: 'https://my-webhook-url.com', params: { ttl: '86400' // 24 hours in seconds } } });
问题核心
Google Calendar的Webhook推送本身就不会在POST请求体中携带事件详情,它的作用只是告知你「目标日历有事件发生了变化」,具体的事件更新内容需要你主动调用API拉取。你收到的x-goog-resource-id等请求头才是关键信息。
正确处理步骤
- 提取关键请求头:收到推送时,从请求中获取
x-goog-resource-uri、x-goog-channel-id、x-goog-resource-id这几个字段x-goog-resource-uri:指向发生变化的日历资源,可直接用于API请求- 另外两个字段用于验证推送合法性,确保请求来自Google而非伪造
- 主动拉取事件变化:调用Calendar API的
events.list接口,传入以下参数:calendarId:目标日历ID(比如你的primary)updatedMin:设置为上次拉取的时间戳,只获取该时间之后更新的事件- 利用服务账号的授权发起请求,获取具体的事件创建/修改/删除信息
- 权限补充检查:确保服务账号已被授予目标日历的访问权限(即使有全域委派,也需要在日历的共享设置中添加服务账号邮箱并赋予相应权限)
- 优化推送配置:可以在
watch请求的requestBody中添加token字段,用于标识不同的订阅(比如区分多个日历的推送),方便后续处理:requestBody: { // ... 现有配置 token: 'primary-calendar-watch-token' }
内容的提问来源于stack exchange,提问作者corycorycory
相关产品推荐
相关产品推荐

