【问题标题】:Google Calendar Push notification 404 error谷歌日历推送通知 404 错误
【发布时间】:2021-03-20 18:55:29
【问题描述】:

我使用以下命令订阅了日历:

calendar.events
          .watch({
            calendarId: aCal.id,
            requestBody: {
              id: uuid.v1(),
              type: "web_hook",
              address: 'http://mywebsite.com',
            },
          })
          .catch((e) => e)

每次创建事件时,我都会收到带有"x-goog-resource-id":"unzJsxcVNifZI5ogOmIKRJ3Oiog" 的通知。

这个ID是什么?谷歌文档声明它是一个“不透明的资源 ID”,但是当我尝试使用这个 ID 获取日历时,我得到了 404。

此 ID 不是事件 ID,因为它对于我在单个日历中创建的每个事件都是相同的。当我在另一个日历中创建事件时,此 ID 会更改。所以它可能是一个日历 ID。

不幸的是,我每次得到以下请求:

calendar.events.list(
      {
        calendarId: calId,
      },
      (err, res) => {
        if (err) reject(err);
    
        resolve(res.data.items);
      }
    );

返回 404。与 Google API 资源管理器相同。

这个ID是什么?我如何知道带有 Id 的日历中发生了什么变化?

感谢您的帮助,

【问题讨论】:

标签: javascript google-api google-calendar-api


【解决方案1】:

通知不会告诉您发生了什么变化,只是告诉您发生了变化。

x-goog-resource-id 代表特定的通知渠道,而不是您正在观看的资源。

由于您可以在许多不同的资源(Acl、CalendarList、Events 和 Settings 资源)上设置通知,因此您只需跟踪通知通道的 id 以及它对应的资源。该通知还包含x-goog-resource-uri,它应该指向已更改的资源。

设置频道

当您发出“watch”请求时。 IE。为这个示例端点创建一个新的通知通道:

https://www.googleapis.com/calendar/v3/calendars/mygreatcalendar@group.calendar.google.com/events/watch

有了这个身体:

{
  "id": "whateverIdyouFeltlikeAdding",
  "type": "web_hook",
  "address": "https://yourwebhookaddress.com"
}

您应该得到这样的响应(ID 是假的):

{
    "kind" : "api#channel",
    "expiration" : "1617113510000",
    "resourceId" : "2iPJp6kI2131231245543aQ_rIFGwE",
    "id" : "whateverIdyouFeltlikeAdding",
    "resourceUri" : "https://www.googleapis.com/calendar/v3/calendars/mygreatcalendar@group.calendar.google.com/events?alt=json"
}

那么你应该发出一个 GET 请求来拍摄当时日历的“快照”。

接收通知并找出发生了什么变化

当您更改事件时,您应该会收到包含此信息的通知(此示例是汇总的并带有虚假数据):

'x-goog-channel-id': 'whateverIdyouFeltlikeAdding',
'x-goog-message-number': '3313856',
'x-goog-resource-id': '2iPJp6kI2131231245543aQ_rIFGwE',
'x-goog-resource-state': 'exists',
'x-goog-resource-uri': 'https://www.googleapis.com/calendar/v3/calendars/mygreatcalendar@group.calendar.google.com/events?alt=json',

请注意,频道创建时的 resourceID 与 x-goog-resource-id 匹配(即使这些特定 ID 是假的)。 x-goog-channel-id 还与您在创建时提供的自定义 id 匹配。

要识别已更改的资源,您需要从创建频道时存储这些 ID,您可以使用 x-goog-channel-idx-goog-resource-id 将它们与本地存储进行比较。

您的本地存储可能是一个简单的 JSON:

{
    '2iPJp6kI2131231245543aQ_rIFGwE' : 'mygreatcalendar@group.calendar.google.com'
}

或者您可以只解析x-goog-resource-uri 以获取日历ID。

一旦您确定了资源,您就必须发出另一个 GET 请求来与您的“快照”进行比较。您可以使用响应中包含的etag 快速扫描哪些特定资源已更改。

文档

【讨论】:

  • 感谢您的精彩回答!
猜你喜欢
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多