14

我已成功设置 Google Pub/Sub 以使用 Gmail API Watch 功能,如下所述: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,或者我只是遗漏了一些东西?

4

1 回答 1

27

看起来我误解了 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的详细信息,需要处理历史挖掘和同步才能找到。

于 2015-08-04T19:51:32.007 回答