รับข้อความ Push

เอกสารนี้อธิบายวิธีใช้การแจ้งเตือนแบบ Push ที่แจ้งให้แอปพลิเคชันของคุณทราบเมื่อทรัพยากรมีการเปลี่ยนแปลง

ภาพรวม

Google ปฏิทิน API มีการแจ้งเตือนแบบ Push ที่ช่วยให้คุณตรวจสอบ การเปลี่ยนแปลงในทรัพยากรได้ คุณสามารถใช้ฟีเจอร์นี้เพื่อปรับปรุงประสิทธิภาพของ แอปพลิเคชัน ซึ่งจะช่วยลดค่าใช้จ่ายด้านเครือข่ายและการประมวลผลเพิ่มเติม ที่เกี่ยวข้องกับการโพลทรัพยากรเพื่อตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่ เมื่อใดก็ตามที่ทรัพยากรที่เฝ้าดูมีการเปลี่ยนแปลง Google ปฏิทิน API จะแจ้งให้แอปพลิเคชันของคุณทราบ

หากต้องการใช้การแจ้งเตือนแบบ Push คุณต้องดำเนินการ 2 อย่างต่อไปนี้

  • ตั้งค่า URL ที่รับหรือตัวรับการเรียกกลับ "Webhook"

    ซึ่งเป็นเซิร์ฟเวอร์ HTTPS ที่จัดการข้อความการแจ้งเตือน API ที่ ทริกเกอร์เมื่อทรัพยากรมีการเปลี่ยนแปลง

  • ตั้งค่า (ช่องทางการแจ้งเตือน) สำหรับปลายทางทรัพยากรแต่ละรายการที่ต้องการ เฝ้าดู

    ช่องทางจะระบุข้อมูลการกำหนดเส้นทางสำหรับข้อความการแจ้งเตือน คุณต้องระบุ URL ที่ต้องการรับการแจ้งเตือนเป็นส่วนหนึ่งของการตั้งค่าช่องทาง เมื่อใดก็ตามที่ทรัพยากรของช่องทางมีการเปลี่ยนแปลง Google Calendar API จะส่งข้อความการแจ้งเตือนเป็นคำขอ POST ไปยัง URL นั้น

ปัจจุบัน Google Calendar API รองรับการแจ้งเตือนสำหรับการเปลี่ยนแปลงทรัพยากร ACL, CalendarList, Events และ Settings

สร้างช่องทางการแจ้งเตือน

หากต้องการขอการแจ้งเตือนแบบ Push คุณต้องตั้งค่าช่องทางการแจ้งเตือน สำหรับทรัพยากรแต่ละรายการที่ต้องการตรวจสอบ หลังจากตั้งค่าช่องทางการแจ้งเตือนแล้ว Google Calendar API จะแจ้งให้แอปพลิเคชันของคุณทราบเมื่อทรัพยากรที่เฝ้าดูมีการเปลี่ยนแปลง

ส่งคำขอเฝ้าดู

ทรัพยากร Google Calendar API ที่เฝ้าดูได้แต่ละรายการจะมีเมธอด watch ที่เกี่ยวข้องที่ URI ในรูปแบบต่อไปนี้

https://www.googleapis.com/API_NAME/API_VERSION/RESOURCE_PATH/watch

หากต้องการตั้งค่าช่องทางการแจ้งเตือนสำหรับข้อความเกี่ยวกับการเปลี่ยนแปลงทรัพยากรที่เฉพาะเจาะจง ให้ส่งคำขอ POST ไปยังเมธอด watch ของทรัพยากร

ช่องทางการแจ้งเตือนแต่ละช่องทางจะเชื่อมโยงกับผู้ใช้และ ทรัพยากร (หรือชุดทรัพยากร) ที่เฉพาะเจาะจง คำขอ watch จะไม่สำเร็จหากผู้ใช้ปัจจุบันไม่ได้เป็นเจ้าของหรือไม่มีสิทธิ์เข้าถึงทรัพยากรนี้

ตัวอย่าง

เริ่มเฝ้าดูการเปลี่ยนแปลงคอลเล็กชันกิจกรรมในปฏิทินที่กำหนด

POST https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events/watch
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab",
  "type": "web_hook",
  "address": "https://mydomain.com/notifications",
  ...
  "token": "target=myApp-myCalendarChannelDest",
  "expiration": 1426325213000
}

ในส่วนเนื้อหาของคำขอ ให้ระบุ id ของช่องทาง type เป็น web_hook และ URL ที่รับใน address นอกจากนี้ คุณยังระบุข้อมูลต่อไปนี้ได้ด้วย (ไม่บังคับ)

  • token ที่จะใช้เป็นโทเค็นของช่องทาง
  • เวลา expiration เป็นมิลลิวินาทีสำหรับเวลาหมดอายุของช่องทางที่คุณขอ

พร็อพเพอร์ตี้ที่จำเป็น

คุณต้องระบุฟิลด์ต่อไปนี้ในคำขอ watch แต่ละรายการ

  • สตริงพร็อพเพอร์ตี้ id ที่ระบุช่องทางการแจ้งเตือนใหม่นี้ อย่างไม่ซ้ำกันภายในโปรเจ็กต์ เราขอแนะนำให้ใช้ ตัวระบุที่ไม่ซ้ำกับผู้อื่น (UUID) หรือสตริงที่ไม่ซ้ำกันที่คล้ายกัน ความยาวสูงสุด 64 อักขระ

    ระบบจะแสดงค่า ID ที่คุณตั้งค่าไว้ในส่วนหัว HTTP X-Goog-Channel-Id ของข้อความการแจ้งเตือนทุกข้อความที่คุณได้รับสำหรับช่องทางนี้

  • สตริงพร็อพเพอร์ตี้ type ที่ตั้งค่าเป็น web_hook

  • สตริงพร็อพเพอร์ตี้ address ที่ตั้งค่าเป็น URL ที่รับฟัง และตอบสนองต่อการแจ้งเตือนสำหรับช่องทางการแจ้งเตือนนี้ ซึ่งเป็น URL เรียกกลับของ Webhook และต้องใช้ HTTPS

    โปรดทราบว่า Google Calendar API จะส่งการแจ้งเตือนไปยัง ที่อยู่ HTTPS นี้ได้ก็ต่อเมื่อมีการติดตั้งใบรับรอง SSL ที่ถูกต้องในเว็บเซิร์ฟเวอร์ ใบรับรองที่ไม่ถูกต้องมีดังต่อไปนี้

    • ใบรับรองแบบ Self-signed
    • ใบรับรองที่ลงนามโดยแหล่งที่มาที่ไม่น่าเชื่อถือ
    • ใบรับรองที่เพิกถอนไปแล้ว
    • ใบรับรองที่มีเรื่องไม่ตรงกับชื่อโฮสต์เป้าหมาย

พร็อพเพอร์ตี้ที่ไม่บังคับ

นอกจากนี้ คุณยังระบุฟิลด์ที่ไม่บังคับต่อไปนี้ด้วย watch คำขอได้ด้วย

  • พร็อพเพอร์ตี้ token ที่ระบุค่าสตริงที่กำหนดเอง เพื่อใช้เป็นโทเค็นของช่องทางการแจ้งเตือน คุณสามารถใช้โทเค็นของช่องทางการแจ้งเตือน เพื่อวัตถุประสงค์ต่างๆ ได้ เช่น คุณสามารถใช้โทเค็นเพื่อยืนยันว่าข้อความขาเข้าแต่ละข้อความมีไว้สำหรับช่องทางที่แอปพลิเคชันของคุณสร้างขึ้น เพื่อให้แน่ใจว่าการแจ้งเตือนไม่ได้เป็นการหลอกลวง หรือเพื่อกำหนดเส้นทางข้อความไปยังปลายทางที่ถูกต้องภายในแอปพลิเคชันตามวัตถุประสงค์ของช่องทางนี้ ความยาวสูงสุด 256 อักขระ

    โทเค็นจะรวมอยู่ในส่วนหัว HTTP X-Goog-Channel-Token ในข้อความการแจ้งเตือนทุกข้อความที่แอปพลิเคชันของคุณได้รับสำหรับช่องทางนี้

    หากคุณใช้โทเค็นของช่องทางการแจ้งเตือน เราขอแนะนำให้คุณดำเนินการดังนี้

    • ใช้รูปแบบการเข้ารหัสที่ขยายได้ เช่น พารามิเตอร์การค้นหา URL ตัวอย่าง: forwardTo=hr&createdBy=mobile

    • อย่าใส่ข้อมูลที่ละเอียดอ่อน เช่น โทเค็น OAuth

  • สตริงพร็อพเพอร์ตี้ expiration ที่ตั้งค่าเป็นการประทับเวลา Unix (เป็นมิลลิวินาที) ของวันที่และเวลาที่ต้องการให้ Google ปฏิทิน API หยุดส่งข้อความสำหรับช่องทางการแจ้งเตือนนี้

    หากช่องทางมีเวลาหมดอายุ ระบบจะรวมเวลาดังกล่าวเป็นค่าของ ส่วนหัว HTTP X-Goog-Channel-Expiration (ในรูปแบบที่มนุษย์อ่านได้ ) ในข้อความการแจ้งเตือนทุกข้อความที่ แอปพลิเคชันของคุณได้รับสำหรับช่องทางนี้

ดูรายละเอียดเพิ่มเติมเกี่ยวกับคำขอได้ที่เมธอด watch สำหรับทรัพยากร ACL, CalendarList, Events และ Settings ในเอกสารอ้างอิง API

การตอบกลับของคำขอเฝ้าดู

หากคำขอ watch สร้างช่องทางการแจ้งเตือนได้สำเร็จ ระบบจะแสดงรหัสสถานะ HTTP 200 OK

ส่วนเนื้อหาข้อความของการตอบกลับการเฝ้าดูจะให้ข้อมูลเกี่ยวกับช่องทางการแจ้งเตือนที่คุณเพิ่งสร้าง ดังที่แสดงในตัวอย่างด้านล่าง

{
  "kind": "api#channel",
  "id": "01234567-89ab-cdef-0123456789ab",
  "resourceId": "o3hgv1538sdjfh",
  "resourceUri": "https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events",
  "token": "target=myApp-myCalendarChannelDest",
  "expiration": 1426325213000
}

ส่วนเนื้อหาของการตอบกลับจะให้รายละเอียดของช่องทาง เช่น

  • kind: ระบุว่านี่คือทรัพยากรช่องทาง API
  • id: รหัสที่คุณระบุสำหรับช่องทางนี้
  • resourceId: รหัสของทรัพยากรที่เฝ้าดู
  • resourceUri: รหัสเฉพาะเวอร์ชันของทรัพยากรที่เฝ้าดู
  • token: โทเค็นที่ระบุในส่วนเนื้อหาของคำขอ
  • expiration: เวลาหมดอายุของช่องทางเป็นการประทับเวลา Unix ในหน่วยมิลลิวินาที

นอกเหนือจากพร็อพเพอร์ตี้ที่คุณส่งเป็นส่วนหนึ่งของคำขอแล้ว ข้อมูลที่แสดงผลยังรวมถึง resourceId และ resourceUri เพื่อระบุทรัพยากรที่กำลังเฝ้าดูในช่องทางการแจ้งเตือนนี้

คุณสามารถส่งข้อมูลที่แสดงผลไปยังการดำเนินการอื่นๆ ของช่องทางการแจ้งเตือน เช่น เมื่อต้องการหยุดรับ การแจ้งเตือน

ดูรายละเอียดเพิ่มเติมเกี่ยวกับการตอบกลับได้ที่เมธอด watch สำหรับทรัพยากร ACL, CalendarList, Events และ Settings ในเอกสารอ้างอิง API

ข้อความซิงค์

หลังจากสร้างช่องทางการแจ้งเตือนเพื่อเฝ้าดูทรัพยากรแล้ว Google ปฏิทิน API จะส่งข้อความ sync เพื่อระบุว่า การแจ้งเตือนกำลังจะเริ่มขึ้น ค่าส่วนหัว X-Goog-Resource-State HTTP สำหรับข้อความเหล่านี้คือ sync เนื่องจากปัญหาการกำหนดเวลาของเครือข่าย คุณจึงอาจได้รับข้อความ sync แม้ว่าจะยังไม่ได้รับการตอบกลับของเมธอด watch ก็ตาม

คุณสามารถละเว้นการแจ้งเตือน sync ได้อย่างปลอดภัย แต่ก็ใช้การแจ้งเตือนนี้ได้เช่นกัน เช่น หากตัดสินใจว่าไม่ต้องการเก็บช่องทางไว้ คุณสามารถใช้ค่า X-Goog-Channel-ID และ X-Goog-Resource-ID ในการเรียกเพื่อ หยุดรับการแจ้งเตือน นอกจากนี้ คุณยังใช้การแจ้งเตือน sync เพื่อทำการเริ่มต้นบางอย่างเพื่อเตรียมพร้อมสำหรับ เหตุการณ์ในภายหลังได้ด้วย

รูปแบบของข้อความ sync ที่ Google ปฏิทิน API ส่งไปยัง URL ที่รับของคุณแสดงไว้ด้านล่าง

POST https://mydomain.com/notifications // Your receiving URL.
X-Goog-Channel-ID: channel-ID-value
X-Goog-Channel-Token: channel-token-value
X-Goog-Channel-Expiration: expiration-date-and-time // In human-readable format. Present only if the channel expires.
X-Goog-Resource-ID: identifier-for-the-watched-resource
X-Goog-Resource-URI: version-specific-URI-of-the-watched-resource
X-Goog-Resource-State: sync
X-Goog-Message-Number: 1

ข้อความซิงค์จะมีค่าส่วนหัว X-Goog-Message-Number HTTP เป็น 1 เสมอ การแจ้งเตือนที่ตามมาแต่ละรายการสำหรับช่องทางนี้มี หมายเลขข้อความที่มากกว่ารายการก่อนหน้า แม้ว่าหมายเลข ข้อความจะไม่เรียงตามลำดับก็ตาม

ต่ออายุช่องทางการแจ้งเตือน

ช่องทางการแจ้งเตือนอาจมีเวลาหมดอายุ โดยมีค่าที่กำหนดโดยคำขอของคุณหรือโดยขีดจำกัดหรือค่าเริ่มต้นภายในของ Google ปฏิทิน API (ระบบจะใช้ค่าที่จำกัดมากกว่า) เวลาหมดอายุของช่องทาง (หากมี) จะรวมอยู่เป็นการประทับเวลา Unix (เป็นมิลลิวินาที) ในข้อมูลที่เมธอด watch แสดงผล นอกจากนี้ วันที่และเวลาหมดอายุจะรวมอยู่ (ในรูปแบบที่มนุษย์อ่านได้) ในข้อความการแจ้งเตือนทุกข้อความที่แอปพลิเคชันของคุณได้รับสำหรับช่องทางนี้ในส่วนหัว HTTP X-Goog-Channel-Expiration

ปัจจุบันยังไม่มีวิธีต่ออายุช่องทางการแจ้งเตือนโดยอัตโนมัติ เมื่อช่องทางใกล้หมดอายุ คุณต้องแทนที่ช่องทางนั้นด้วยช่องทางใหม่โดยเรียกเมธอด watch และเช่นเคย คุณต้องใช้ค่าที่ไม่ซ้ำกันสำหรับ พร็อพเพอร์ตี้ id ของช่องทางใหม่ โปรดทราบว่าอาจมีช่วงเวลา "ทับซ้อน" ที่ช่องทางการแจ้งเตือน 2 ช่องทางสำหรับ ทรัพยากรเดียวกันทำงานอยู่

รับการแจ้งเตือน

เมื่อใดก็ตามที่ทรัพยากรที่เฝ้าดูมีการเปลี่ยนแปลง แอปพลิเคชันของคุณจะได้รับข้อความการแจ้งเตือนที่อธิบายการเปลี่ยนแปลง Google ปฏิทิน API จะส่งข้อความเหล่านี้ เป็นคำขอ HTTPSPOST ไปยัง URL ที่คุณระบุเป็น addressพร็อพเพอร์ตี้สำหรับช่องทางการแจ้งเตือน นี้

ทำความเข้าใจรูปแบบข้อความการแจ้งเตือน

ข้อความการแจ้งเตือนทั้งหมดจะมีชุดส่วนหัว HTTP ที่มี X-Goog- คำนำหน้า การแจ้งเตือนบางประเภทอาจมีส่วนเนื้อหาของข้อความด้วย

ส่วนหัว

ข้อความการแจ้งเตือนที่ Google ปฏิทิน API โพสต์ไปยัง URL ที่รับของคุณจะมีส่วนหัว HTTP ต่อไปนี้

ส่วนหัว คำอธิบาย
มีอยู่เสมอ
X-Goog-Channel-ID UUID หรือสตริงที่ไม่ซ้ำกันอื่นๆ ที่คุณระบุเพื่อระบุช่องทางการแจ้งเตือนนี้
X-Goog-Message-Number จำนวนเต็มที่ระบุข้อความนี้สำหรับช่องทางการแจ้งเตือนนี้ ค่าจะเป็น 1 เสมอสำหรับข้อความ sync หมายเลขข้อความ จะเพิ่มขึ้นสำหรับข้อความที่ตามมาแต่ละข้อความในช่องทาง แต่จะไม่เรียงตามลำดับ
X-Goog-Resource-ID ค่าทึบแสงที่ระบุทรัพยากรที่เฝ้าดู รหัสนี้จะ เสถียรใน API เวอร์ชันต่างๆ
X-Goog-Resource-State สถานะทรัพยากรใหม่ที่ทริกเกอร์การแจ้งเตือน ค่าที่เป็นไปได้ ได้แก่ sync, exists หรือ not_exists.
X-Goog-Resource-URI ตัวระบุเฉพาะเวอร์ชัน API สำหรับทรัพยากรที่เฝ้าดู
มีอยู่บางครั้ง
X-Goog-Channel-Expiration วันที่และเวลาหมดอายุของช่องทางการแจ้งเตือนในรูปแบบที่มนุษย์อ่านได้ จะมีอยู่ก็ต่อเมื่อมีการกำหนดไว้
X-Goog-Channel-Token โทเค็นของช่องทางการแจ้งเตือนที่แอปพลิเคชันของคุณตั้งค่าไว้ และ คุณสามารถใช้เพื่อยืนยันแหล่งที่มาของการแจ้งเตือน จะมีอยู่ก็ต่อเมื่อมีการกำหนดไว้

ข้อความการแจ้งเตือนที่ Calendar API โพสต์ไปยัง URL ที่รับของคุณจะไม่มีส่วนเนื้อหาของข้อความ ข้อความเหล่านี้ไม่มีข้อมูลที่เฉพาะเจาะจงเกี่ยวกับทรัพยากรที่อัปเดต คุณต้องทำการเรียก API อีกครั้งเพื่อดูรายละเอียดการเปลี่ยนแปลงทั้งหมด

ตัวอย่าง

ข้อความการแจ้งเตือนการเปลี่ยนแปลงสำหรับคอลเล็กชันกิจกรรมที่แก้ไข

POST https://mydomain.com/notifications
Content-Type: application/json; utf-8
Content-Length: 0
X-Goog-Channel-ID: 4ba78bf0-6a47-11e2-bcfd-0800200c9a66
X-Goog-Channel-Token: 398348u3tu83ut8uu38
X-Goog-Channel-Expiration: Tue, 19 Nov 2013 01:13:52 GMT
X-Goog-Resource-ID:  ret08u3rv24htgh289g
X-Goog-Resource-URI: https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events
X-Goog-Resource-State:  exists
X-Goog-Message-Number: 10

ตอบสนองต่อการแจ้งเตือนต่างๆ

หากต้องการระบุว่าสำเร็จ คุณสามารถแสดงรหัสสถานะใดรหัสหนึ่งต่อไปนี้: 200, 201, 202, 204, หรือ 102

หากบริการของคุณใช้ ไลบรารีของไคลเอ็นต์ API ของ Google และแสดง 500,502, 503 หรือ 504 Google ปฏิทิน API จะลองอีกครั้งโดยใช้ Exponential Backoff ระบบจะถือว่ารหัสสถานะที่แสดงผลอื่นๆ ทั้งหมดเป็นการส่งข้อความล้มเหลว

ทำความเข้าใจเหตุการณ์การแจ้งเตือนของ Google ปฏิทิน API

ส่วนนี้ให้รายละเอียดเกี่ยวกับข้อความการแจ้งเตือนที่คุณอาจได้รับเมื่อใช้การแจ้งเตือนแบบ Push กับ Google ปฏิทิน API

X-Goog-Resource-State ใช้กับ ส่งเมื่อ
sync ACL, รายการปฏิทิน, กิจกรรม, การตั้งค่า สร้างช่องทางใหม่ได้สำเร็จ ตอนนี้คุณรับการแจ้งเตือนได้แล้ว
exists ACL, รายการปฏิทิน, กิจกรรม, การตั้งค่า ทรัพยากรมีการเปลี่ยนแปลง การเปลี่ยนแปลงที่เป็นไปได้ ได้แก่ การสร้างทรัพยากรใหม่ หรือการแก้ไขหรือลบทรัพยากรที่มีอยู่

ปิดการแจ้งเตือน

พร็อพเพอร์ตี้ expiration จะควบคุมเวลาที่การแจ้งเตือนจะหยุดโดยอัตโนมัติ คุณเลือกหยุดรับการแจ้งเตือนสำหรับช่องทางที่เฉพาะเจาะจงก่อนที่ช่องทางจะหมดอายุได้โดยเรียกเมธอด stop ที่ URI ต่อไปนี้

https://www.googleapis.com/workspace/calendar/api/v3/reference/channels/stop

เมธอดนี้กำหนดให้คุณระบุพร็อพเพอร์ตี้ของช่องทางอย่างน้อย 1 รายการ id และ resourceId ดังที่แสดงใน ตัวอย่างด้านล่าง โปรดทราบว่าหาก Google Calendar API มีทรัพยากรหลายประเภทที่มี เมธอด watch จะมี เมธอด stop เพียงเมธอดเดียว

เฉพาะผู้ใช้ที่มีสิทธิ์ที่เหมาะสมเท่านั้นที่จะหยุดช่องทางได้ โดยเฉพาะอย่างยิ่งฟีเจอร์ต่อไปนี้

  • หากช่องทางสร้างขึ้นโดยบัญชีผู้ใช้ทั่วไป เฉพาะผู้ใช้รายเดียวกันจากไคลเอ็นต์เดียวกัน (ตามที่ระบุโดยรหัสไคลเอ็นต์ OAuth 2.0 จากโทเค็นการให้สิทธิ์) ที่สร้างช่องทางเท่านั้นที่จะหยุดช่องทางได้
  • หากช่องทางสร้างขึ้นโดยบัญชีบริการ ผู้ใช้จากไคลเอ็นต์เดียวกันจะหยุดช่องทางได้

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีหยุดรับการแจ้งเตือน

POST https://www.googleapis.com/workspace/calendar/api/v3/reference/channels/stop
  
Authorization: Bearer CURRENT_USER_AUTH_TOKEN
Content-Type: application/json

{
  "id": "4ba78bf0-6a47-11e2-bcfd-0800200c9a66",
  "resourceId": "ret08u3rv24htgh289g"
}