【问题标题】:Gmail API users.watch - no details for historyIdGmail API users.watch - historyId 没有详细信息
【发布时间】:2015-10-26 03:47:09
【问题描述】:

我已成功设置 Google Pub/Sub 以使用 Gmail API 观看功能,如下所述:https://developers.google.com/gmail/api/guides/push 观看我的 gmail 帐户中的收件箱标签。

一旦有新消息到达,我会立即收到一条有效格式的推送通知,例如:

{ message: 
    { data: '.......',
    attributes: {},
    message_id: '1248700053943' },
subscription: '.....' }

base64decode 数据后,我收到电子邮件和 historyId。然后,按照建议,我请求 gmail.users.history.list API(通过 API 控制台),并将 startHistoryId 设置为推送通知中的 historyId。然后得到没有任何细节的空响应:

GET https://www.googleapis.com/gmail/v1/users/me/history?startHistoryId=4658879&key={YOUR_API_KEY}
200 OK
- Show headers 
{
 "historyId": "4658894"
}

因此,通知中的 historyId 似乎无效。 似乎 Gmail users.watch API 无法正常工作,并发送了错误的 historyId,或者我只是遗漏了什么?

【问题讨论】:

  • 您确定您在测试应用程序中使用的电子邮件地址与在 API Explorer 中使用的电子邮件地址完全相同吗?
  • @Tholle,是的。此外,如果我从提供的 historyId 中减去一点,例如,不是 4658879 而是 4658800 并将其用作 startHistoryId,我就可以在响应数组中间的某个位置获取有关新消息的数据。它不准确,并且像魔术一样工作,我需要直接的方法来通过 histroyId 从推送消息中获取准确的数据。
  • 你是如何设置watch api部分的,我的意思是我在哪里调用这个API或者它是一个sdk客户端?我如何使用手表,如果您可以分享代码/步骤,请

标签: google-api gmail-api google-cloud-pubsub


【解决方案1】:

看来我误解了 users.history.list 的工作方式,流程应该如下所述:

  1. 从 users.watch 请求的响应中记住 historyId。

  2. 在推送通知中调用 users.history.list,之前记住的 historyId 为 startHistoryId 而不是通知中的新的,并获取最近更改的列表。

  3. 记住通知中的 historyId,然后转到 2。

如果我们查看对 users.history.list 的任何调用的响应,historyId 始终存在,它是最新历史更改的标记。推送通知会带来最新的 historyId,所以如果我们用它来请求 users.history.list(如问题所示),我们会得到空的历史数组,服务器会从响应中删除这个空的“历史”字段,这就是我们得到这个的原因:

{
 "historyId": "4658894"
}

但不是这个:

{
 "history": [ ],
 "historyId": "4658894"
}

同步指南中提供了更多详细信息:https://developers.google.com/gmail/api/guides/sync#partial

所以我们不能轻易的从推送通知中获得新消息到达INBOX的详细信息,需要处理历史挖掘和同步才能找到。

【讨论】:

  • 是的,推送通知只是一个失效通知。然后,客户端应该至少调用 history.list(),然后可能还有其他调用,如 messages.get(),以便完全更新。
  • 有什么方法可以获取触发第一个 webhook 的消息?在您描述的情况下,我们永远不会收到初始电子邮件。
猜你喜欢
  • 2018-05-30
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2022-08-22
相关资源
最近更新 更多