使用Kotlin配置Google Calendar API v3 watch方法实现事件变更推送
Google Calendar V3 API watch方法Channel配置方案
核心必填参数说明
id: 你自行生成的通道唯一标识,长度不超过64字符,用于区分不同的监控通道type: 固定取值web_hook,目前Google Calendar API仅支持webhook类型的变更通知address: 你的服务端公网可访问的HTTPS回调地址,日历发生变更时Google会向该地址发送POST通知,注意必须是HTTPS协议,不支持HTTP和自签名证书token(可选): 自定义校验值,Google推送通知时会将该值放在请求头中,可用于校验请求来源合法性,避免恶意请求expiration(可选): 通道过期时间戳,单位为毫秒,默认最长有效期为1个月,到期后需重新调用watch方法创建新通道
配置步骤和代码修改
你之前的Channel配置缺少必填参数,调整后的相关代码如下:
import java.util.UUID fun main() { val calendar = CalendarAPI() val channel = Channel() // 填必填参数 channel.id = UUID.randomUUID().toString() // 生成唯一通道ID channel.type = "web_hook" // 固定值 channel.address = "https://替换为你的公网HTTPS回调地址" // 替换为你自己的服务地址 // 可选参数配置 channel.token = "自定义校验token" channel.expiration = System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000 // 示例:设置7天后过期 // 执行watch调用启动监控 val createdChannel = calendar.service.events().watch("primary", channel).execute() // 建议本地存储返回的通道信息:id、resourceId、过期时间,方便后续续期或停止监控 println("监控通道创建成功,通道ID: ${createdChannel.id}, 资源ID: ${createdChannel.resourceId}, 过期时间: ${createdChannel.expiration}") // 以下为原有逻辑,保持不变即可 println("Upcoming events:") val events = calendar .getNext10Events(DateTime(System.currentTimeMillis())) calendar.printEvents(events) calendar.deleteAllEvents("primary") println("\nNew events:") val event = calendar.createEvent( summary = "CalendarEvent", calendarId = "primary", startDateTime = DateTime("2021-07-08T14:00:00.000+03:00"), endDateTime = DateTime("2021-07-08T15:00:00.000+03:00") ) calendar.printEvents(calendar.getNext10Events(DateTime(System.currentTimeMillis()))) }
回调端处理逻辑说明
- 首次创建通道时,Google会向回调地址发送校验请求,你需要返回200状态码响应,否则通道会创建失败
- 正常变更通知的请求头中会携带
X-Goog-Channel-Token(你设置的自定义校验token)、X-Goog-Resource-State(变更类型,新增/修改为exists,删除为not_exists) - Google的推送通知不会携带具体的事件内容,你收到通知后需要调用
events.list接口同步最新的事件列表,和本地存储的内容对比,判断具体的变更内容 - 通道到期前需要重新调用watch方法创建新通道,避免监控中断
常见注意事项
- 回调地址必须是公网可访问的HTTPS地址,不能使用localhost,本地调试可以用内网穿透工具映射为公网HTTPS地址
- 如需主动停止监控,可以调用
calendar.service.channels().stop(createdChannel).execute()销毁通道 - 同一个日历最多可创建10个有效的watch通道,超过限制会报错
内容的提问来源于stack exchange,提问作者Стоян Тинчев
相关产品推荐
相关产品推荐

