2015-08-03 19 views
8

Tôi đã thiết lập thành công Google Pub/Sub để sử dụng tính năng Gmail API Watch như được mô tả ở đây: https://developers.google.com/gmail/api/guides/push để xem nhãn INBOX trong tài khoản gmail của tôi.Gmail API users.watch - không có chi tiết cho historyId

Khi tin nhắn mới đến tôi ngay lập tức nhận được thông báo push ở định dạng hợp lệ như:

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

Sau khi tôi base64decode dữ liệu tôi nhận được email và historyId. Sau đó, như được đề xuất, tôi yêu cầu API gmail.users.history.list (thông qua bảng điều khiển API) với startHistoryId được đặt thành historyId từ thông báo đẩy. Và sau đó chỉ nhận được phản hồi trống mà không có bất kỳ chi tiết nào:

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

Vì vậy, lịch sửCó vẻ như không hợp lệ. Có vẻ như người dùng Gmail.watch API không hoạt động bình thường và gửi sai historyId hoặc tôi chỉ thiếu một cái gì đó?

+0

Bạn có chắc là bạn đang sử dụng đúng địa chỉ email trong ứng dụng thử nghiệm của mình như trong Trình khám phá API không? – Tholle

+0

@Tholle, Có. Ngoài ra, nếu tôi trừ một chút từ historyId được cung cấp, giả sử, không phải 4658879 nhưng 4658800 và sử dụng nó như startHistoryId tôi có thể lấy dữ liệu về thư mới ở đâu đó ở giữa mảng phản hồi. Nó không chính xác, và hoạt động như một phép thuật, tôi cần một cách đơn giản để lấy dữ liệu chính xác bằng một histroyId từ một tin nhắn push. –

Trả lời

13

Hình như tôi hiểu lầm công trình như thế nào users.history.list, và dòng chảy nên một cái gì đó giống như mô tả dưới đây:

  1. Ghi historyId từ phản ứng của yêu cầu users.watch.

  2. Khi người dùng gọi thông báo push user.history.list với lịch sử được ghi nhớ trước đây, hãy nhớ là startHistoryId thay vì thông báo mới từ thông báo và nhận danh sách các thay đổi gần đây.

  3. Ghi historyId từ thông báo, và goto 2.

Nếu chúng ta nhìn vào phản ứng của bất kỳ cuộc gọi đến users.history.list, historyId luôn luôn hiện diện, đó là một dấu hiệu của sự thay đổi lịch sử mới nhất. Thông báo đẩy mang historyId mới nhất, vì vậy nếu chúng tôi yêu cầu users.history.list với nó (như trong câu hỏi), chúng tôi có mảng trống lịch sử và máy chủ thả trường "lịch sử" trống này khỏi phản hồi, đó là lý do tại sao chúng tôi nhận được :

{ 
"historyId": "4658894" 
} 

Nhưng không này:

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

thông tin chi tiết được cung cấp đồng bộ hướng dẫn: https://developers.google.com/gmail/api/guides/sync#partial

Vì vậy, chúng ta không thể dễ dàng có được thông tin chi tiết của thông điệp mới đến để INBOX từ thông báo đẩy, và cần phải đối phó với khai thác lịch sử và đồng bộ chronization để tìm thấy nó.

+5

Có, thông báo đẩy chỉ là thông báo vô hiệu. Sau đó, khách hàng sẽ gọi ít nhất history.list() và sau đó có thể là các cuộc gọi khác như messages.get() để có được đầy đủ cập nhật kết quả. –

+1

Có cách nào để nhận được thông báo kích hoạt webhook đầu tiên không? Trong trường hợp bạn mô tả, chúng tôi sẽ không bao giờ nhận được email ban đầu. – squixy

Các vấn đề liên quan