Calendar API จะแสดงข้อมูลข้อผิดพลาด 2 ระดับดังนี้
- รหัสข้อผิดพลาดของ HTTP และข้อความในส่วนหัว
- ออบเจ็กต์ JSON ในส่วนเนื้อหาของการตอบกลับที่มีรายละเอียดเพิ่มเติมที่ช่วยให้คุณระบุวิธีจัดการข้อผิดพลาดได้
ส่วนที่เหลือของหน้านี้ให้ข้อมูลอ้างอิงเกี่ยวกับข้อผิดพลาดในปฏิทิน พร้อมคำแนะนำเกี่ยวกับวิธีจัดการข้อผิดพลาดในแอป
ใช้ Exponential Backoff
เอกสารประกอบเกี่ยวกับ Cloud API มีคำอธิบายที่ชัดเจนเกี่ยวกับ Exponential Backoff และวิธีใช้กับ Google API
ข้อผิดพลาดและการดำเนินการที่แนะนำ
ส่วนนี้แสดงแทน JSON ที่สมบูรณ์ของข้อผิดพลาดแต่ละรายการในรายการ และการดำเนินการที่แนะนำที่คุณอาจจัดการ
400: คำขอไม่ถูกต้อง
ข้อผิดพลาดของผู้ใช้ ซึ่งอาจหมายความว่าไม่มีช่องหรือพารามิเตอร์ที่จำเป็น ค่าที่ระบุไม่ถูกต้อง หรือชุดค่าผสมของช่องที่กำหนดไม่ถูกต้อง
{
"error": {
"errors": [
{
"domain": "calendar",
"reason": "timeRangeEmpty",
"message": "The specified time range is empty.",
"locationType": "parameter",
"location": "timeMax",
}
],
"code": 400,
"message": "The specified time range is empty."
}
}
การดำเนินการที่แนะนำ: เนื่องจากนี่เป็นข้อผิดพลาดถาวร โปรดอย่าลองอีกครั้ง โปรดอ่านข้อความแสดงข้อผิดพลาดแทนและเปลี่ยนคำขอตามความเหมาะสม
401: ข้อมูลเข้าสู่ระบบไม่ถูกต้อง
ส่วนหัวการให้สิทธิ์ไม่ถูกต้อง โทเค็นเพื่อการเข้าถึงที่คุณใช้อยู่หมดอายุหรือไม่ถูกต้อง
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization",
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
การดำเนินการที่แนะนำ
- รับโทเค็นเพื่อการเข้าถึงใหม่โดยใช้โทเค็นการรีเฟรชที่ใช้ได้นาน
- หากไม่สำเร็จ ให้นำทางผู้ใช้ตามขั้นตอนของ OAuth ตามที่อธิบายไว้ในการให้สิทธิ์คำขอด้วย OAuth 2.0
- หากคุณเห็นสิ่งนี้สำหรับบัญชีบริการ ให้ตรวจสอบว่าคุณได้ทำตามขั้นตอนทั้งหมดในหน้าบัญชีบริการเสร็จสมบูรณ์แล้ว
403: อัตราผู้ใช้เกินขีดจำกัด
หนึ่งในขีดจำกัดจาก Developer Console แล้ว
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "userRateLimitExceeded",
"message": "User Rate Limit Exceeded"
}
],
"code": 403,
"message": "User Rate Limit Exceeded"
}
}
การดำเนินการที่แนะนำ
- ตรวจสอบว่าแอปทำตามแนวทางปฏิบัติแนะนำจากจัดการโควต้า
- เพิ่มโควต้าต่อผู้ใช้ในโปรเจ็กต์ Developer Console
- หากผู้ใช้รายหนึ่งส่งคำขอจำนวนมากในนามของผู้ใช้บัญชี Google Workspace หลายคน ให้พิจารณาใช้บัญชีบริการที่มีการมอบสิทธิ์ทั่วทั้งโดเมนและตั้งค่าพารามิเตอร์
quotaUser
- ใช้ Exponential Backoff
403: เกินขีดจำกัดของอัตรา
ผู้ใช้ส่งคำขอถึงอัตราคำขอสูงสุดของ Google ปฏิทิน API ต่อปฏิทินหรือต่อผู้ใช้ที่ตรวจสอบสิทธิ์แล้ว
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "Rate Limit Exceeded"
}
],
"code": 403,
"message": "Rate Limit Exceeded"
}
}
การดำเนินการที่แนะนำ: ข้อผิดพลาด rateLimitExceeded
รายการอาจแสดงรหัสข้อผิดพลาด 403 หรือ 429 ก็ได้ ซึ่งขณะนี้ฟังก์ชันดังกล่าวคล้ายกันและควรตอบสนองในลักษณะเดียวกันโดยใช้ Exponential Backoff
นอกจากนี้ โปรดตรวจสอบว่าแอปทำตามแนวทางปฏิบัติแนะนำจาก
จัดการโควต้า
403: การใช้งานปฏิทินเกินขีดจำกัด
ผู้ใช้ใช้งานถึงขีดจำกัดหนึ่งของ Google ปฏิทินที่กำหนดไว้เพื่อปกป้องผู้ใช้และโครงสร้างพื้นฐานของ Google จากพฤติกรรมการละเมิด
{
"error": {
"errors": [
{
"domain": "usageLimits",
"message": "Calendar usage limits exceeded.",
"reason": "quotaExceeded"
}
],
"code": 403,
"message": "Calendar usage limits exceeded."
}
}
การดำเนินการที่แนะนำ
- อ่านเพิ่มเติมเกี่ยวกับขีดจำกัดการใช้งานปฏิทินได้ที่ความช่วยเหลือสำหรับผู้ดูแลระบบ Google Workspace
403: ไม่อนุญาตสำหรับผู้ที่ไม่ใช่ผู้จัด
คำขออัปเดตกิจกรรมกำลังพยายามตั้งค่าพร็อพเพอร์ตี้กิจกรรมที่แชร์ในสำเนาที่ไม่ใช่ของผู้จัด ผู้จัดเท่านั้นที่ตั้งค่าพร็อพเพอร์ตี้ที่แชร์ (เช่น guestsCanInviteOthers
, guestsCanModify
หรือ guestsCanSeeOtherGuests
) ได้
{
"error": {
"errors": [
{
"domain": "calendar",
"reason": "forbiddenForNonOrganizer",
"message": "Shared properties can only be changed by the organizer of the event."
}
],
"code": 403,
"message": "Shared properties can only be changed by the organizer of the event."
}
}
การดำเนินการที่แนะนำ
- หากคุณกำลังใช้เหตุการณ์: แทรก, เหตุการณ์: นำเข้า หรือเหตุการณ์: อัปเดต และคำขอไม่ได้รวมพร็อพเพอร์ตี้ที่แชร์ใดๆ ก็ตามจะเทียบเท่ากับการพยายามตั้งค่าพร็อพเพอร์ตี้เป็นค่าเริ่มต้น ลองใช้เหตุการณ์: แพตช์แทน
- หากคำขอมีพร็อพเพอร์ตี้ที่แชร์ โปรดตรวจสอบว่าคุณพยายามเปลี่ยนพร็อพเพอร์ตี้เหล่านี้เฉพาะเมื่ออัปเดตสำเนาของผู้จัดเท่านั้น
404: ไม่พบ
ไม่พบทรัพยากรที่ระบุ กรณีนี้อาจเกิดขึ้นได้ในหลายกรณี โดยมีตัวอย่างดังนี้
- เมื่อไม่มีทรัพยากรที่ขอ (ตามรหัสที่ระบุ)
เมื่อเข้าถึงปฏิทินที่ผู้ใช้เข้าถึงไม่ได้
{ "ข้อผิดพลาด": { "ข้อผิดพลาด": [ { "domain": "global", "reason": "notFound", "message": "ไม่พบ" } ], "code": 404, "message": "ไม่พบ" } }
การดำเนินการที่แนะนำ: ใช้ Exponential Backoff
409: มีตัวระบุที่ขออยู่แล้ว
มีอินสแตนซ์ที่มีรหัสที่ระบุอยู่ในพื้นที่เก็บข้อมูลแล้ว
{
"error": {
"errors": [
{
"domain": "global",
"reason": "duplicate",
"message": "The requested identifier already exists."
}
],
"code": 409,
"message": "The requested identifier already exists."
}
}
การดำเนินการที่แนะนำ: สร้างรหัสใหม่หากคุณต้องการสร้างอินสแตนซ์ใหม่ หรือมิฉะนั้น ให้ใช้การเรียกเมธอด update
410: หมดแล้ว
พารามิเตอร์ syncToken
หรือ updatedMin
ใช้งานไม่ได้อีกต่อไป นอกจากนี้ ข้อผิดพลาดนี้อาจเกิดขึ้นหากคำขอพยายามลบกิจกรรมที่ลบไปแล้ว
{
"error": {
"errors": [
{
"domain": "calendar",
"reason": "fullSyncRequired",
"message": "Sync token is no longer valid, a full sync is required.",
"locationType": "parameter",
"location": "syncToken",
}
],
"code": 410,
"message": "Sync token is no longer valid, a full sync is required."
}
}
หรือ
{
"error": {
"errors": [
{
"domain": "calendar",
"reason": "updatedMinTooLongAgo",
"message": "The requested minimum modification time lies too far in the past.",
"locationType": "parameter",
"location": "updatedMin",
}
],
"code": 410,
"message": "The requested minimum modification time lies too far in the past."
}
}
หรือ
{
"error": {
"errors": [
{
"domain": "global",
"reason": "deleted",
"message": "Resource has been deleted"
}
],
"code": 410,
"message": "Resource has been deleted"
}
}
การดำเนินการที่แนะนำ: สำหรับพารามิเตอร์ syncToken
หรือ updatedMin
ให้ล้างข้อมูลใน Store และซิงค์อีกครั้ง ดูรายละเอียดเพิ่มเติมได้ที่ซิงค์ทรัพยากรอย่างมีประสิทธิภาพ
คุณไม่จำเป็นต้องดำเนินการใดๆ สำหรับกิจกรรมที่ถูกลบแล้ว
412: เงื่อนไขที่กำหนดไว้ล่วงหน้าล้มเหลว
etag ที่ให้ไว้ในส่วนหัว If-match ไม่สอดคล้องกับแท็กปัจจุบันของทรัพยากรอีกต่อไป
{
"error": {
"errors": [
{
"domain": "global",
"reason": "conditionNotMet",
"message": "Precondition Failed",
"locationType": "header",
"location": "If-Match",
}
],
"code": 412,
"message": "Precondition Failed"
}
}
การดำเนินการที่แนะนำ: ดึงข้อมูลเอนทิตีอีกครั้งและนำการเปลี่ยนแปลงไปใช้อีกครั้ง ดูรายละเอียดเพิ่มเติมได้ที่รับทรัพยากรเวอร์ชันที่ต้องการ
429: มีคำขอมากเกินไป
ข้อผิดพลาด rateLimitExceeded
เกิดขึ้นเมื่อผู้ใช้ส่งคำขอมากเกินไปภายในระยะเวลาที่กำหนด
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "Rate Limit Exceeded"
}
],
"code": 429,
"message": "Rate Limit Exceeded"
}
}
การดำเนินการที่แนะนำ: ข้อผิดพลาด rateLimitExceeded
รายการอาจแสดงรหัสข้อผิดพลาด 403 หรือ 429 ก็ได้ ซึ่งขณะนี้ฟังก์ชันดังกล่าวคล้ายกันและควรตอบสนองในลักษณะเดียวกันโดยใช้ Exponential Backoff
นอกจากนี้ โปรดตรวจสอบว่าแอปทำตามแนวทางปฏิบัติแนะนำจาก
จัดการโควต้า
500: ข้อผิดพลาดของแบ็กเอนด์
เกิดข้อผิดพลาดที่ไม่คาดคิดขณะประมวลผลคำขอ
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "Backend Error",
}
],
"code": 500,
"message": "Backend Error"
}
}
การดำเนินการที่แนะนำ: ใช้ Exponential Backoff