我已经成功设置Google Pub/Sub使用Gmail API Watch功能,如下所述:https://developers.google.com/gmail/api/guides/push查看我Gmail帐户中的INBOX标签。
一旦新消息到达,我立即收到有效格式的推送通知,如:
{ message:
{ data: '.......',
attributes: {},
message_id: '1248700053943' },
subscription: '.....' }
我base64decode数据后,我得到电子邮件和历史id。然后,按照建议,我请求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用户。手表API不能正常工作,并发送错误的historyId,或者我只是错过了什么?
看起来我误解了users.history.list的工作方式,流程应该像下面描述的那样:
-
从用户响应中记住historyId。观看请求。
-
在推送通知调用users.history.list与先前记住的历史id startHistoryId而不是从通知的新一个,并获得最近更改的列表
-
记住notification中的historyId,然后转到2
如果我们查看任何调用users.history的响应。列表中,historyId总是存在的,它是最新历史变化的标志。推送通知带来了最新的历史id,所以如果我们用它来请求users.history.list(就像在问题中一样),我们得到了一个空的历史数组,服务器从响应中删除了这个空的"历史"字段,这就是为什么我们得到这个:
{
"historyId": "4658894"
}
但不是这个:
{
"history": [ ],
"historyId": "4658894"
}
更多细节请参见同步指南:https://developers.google.com/gmail/api/guides/sync#partial
因此,我们不能轻易地从推送通知中获得到达INBOX的新消息的详细信息,需要处理历史挖掘和同步才能找到它。