จัดการข้อผิดพลาดของ API

Calendar API จะแสดงข้อมูลข้อผิดพลาด 2 ระดับ ดังนี้

  • รหัสและข้อความแสดงข้อผิดพลาด HTTP ในส่วนหัว
  • ออบเจ็กต์ JSON ในเนื้อหาการตอบกลับพร้อมรายละเอียดเพิ่มเติมที่จะช่วยให้คุณ ระบุวิธีจัดการข้อผิดพลาดได้

ส่วนที่เหลือของหน้านี้จะให้ข้อมูลอ้างอิงเกี่ยวกับข้อผิดพลาดของปฏิทิน พร้อม คำแนะนำเกี่ยวกับวิธีจัดการข้อผิดพลาดเหล่านั้นในแอป

ใช้ Exponential Backoff

เอกสารประกอบเกี่ยวกับ Cloud API อธิบายการถอยแบบทวีคูณและวิธีใช้กับ Google APIs ได้อย่างดี

ข้อผิดพลาดและการดำเนินการที่แนะนำ

ส่วนนี้จะแสดงการแทน 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: User Rate Limit Exceeded

ถึงขีดจำกัดอย่างใดอย่างหนึ่งจาก Developer Console แล้ว

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "userRateLimitExceeded",
    "message": "User Rate Limit Exceeded"
   }
  ],
  "code": 403,
  "message": "User Rate Limit Exceeded"
 }
}

การดำเนินการที่แนะนำ

403: เกินขีดจำกัดของอัตรา

ผู้ใช้ส่งคำขอถึงอัตราคำขอสูงสุดต่อปฏิทิน หรือต่อผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์ของ Google Calendar API

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "rateLimitExceeded",
    "message": "Rate Limit Exceeded"
   }
  ],
  "code": 403,
  "message": "Rate Limit Exceeded"
 }
}

การดำเนินการที่แนะนำ: ข้อผิดพลาด rateLimitExceeded อาจแสดงรหัสข้อผิดพลาด 403 หรือ 429 ปัจจุบันข้อผิดพลาดทั้ง 2 รายการนี้ทำงานคล้ายกันและควรได้รับการตอบสนอง ในลักษณะเดียวกันโดยใช้ Exponential Backoff นอกจากนี้ โปรดตรวจสอบว่าแอปเป็นไปตามแนวทางปฏิบัติแนะนำจาก จัดการโควต้า

403: Calendar usage limits exceeded

ผู้ใช้ถึงขีดจำกัดอย่างใดอย่างหนึ่งของ Google ปฏิทินที่กำหนดไว้เพื่อปกป้องผู้ใช้และโครงสร้างพื้นฐานของ Google จากพฤติกรรมการละเมิด

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "message": "Calendar usage limits exceeded.",
    "reason": "quotaExceeded"
   }
  ],
  "code": 403,
  "message": "Calendar usage limits exceeded."
 }
}

การดำเนินการที่แนะนำ

403: Forbidden สำหรับผู้ที่ไม่ใช่ผู้จัดการประชุม

คำขออัปเดตกิจกรรมพยายามตั้งค่าพร็อพเพอร์ตี้กิจกรรมที่แชร์รายการใดรายการหนึ่ง ในสำเนาที่ไม่ใช่ของผู้จัด ผู้จัดการประชุมเท่านั้นที่ตั้งค่าพร็อพเพอร์ตี้ที่แชร์ (เช่น 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."
 }
}

การดำเนินการที่แนะนำ

  • หากคุณใช้ Events: insert, Events: import หรือ Events: update และคำขอของคุณไม่มี พร็อพเพอร์ตี้ที่แชร์ใดๆ การดำเนินการนี้จะเทียบเท่ากับการพยายามตั้งค่าพร็อพเพอร์ตี้เหล่านั้นเป็นค่าเริ่มต้น ลองใช้ Events: patch แทน
  • หากคำขอมีพร็อพเพอร์ตี้ที่แชร์ โปรดตรวจสอบว่าคุณพยายามเปลี่ยนพร็อพเพอร์ตี้เหล่านี้ก็ต่อเมื่อคุณกำลังอัปเดตสำเนาของผู้จัดการประชุม

404: ไม่พบ

ไม่พบทรัพยากรที่ระบุ ซึ่งอาจเกิดขึ้นได้ในหลายกรณี โดยมีตัวอย่างดังนี้

  • เมื่อไม่มีทรัพยากรที่ขอ (ที่มีรหัสที่ระบุ)
  • เมื่อเข้าถึงปฏิทินที่ผู้ใช้เข้าถึงไม่ได้

    { "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Not Found" } ], "code": 404, "message": "Not Found" } }

การดำเนินการที่แนะนำ: ใช้ Exponential Backoff

409: มีตัวระบุที่ขออยู่แล้ว

มีอินสแตนซ์ที่มีรหัสที่ระบุในที่เก็บข้อมูลอยู่แล้ว

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "duplicate",
    "message": "The requested identifier already exists."
   }
  ],
  "code": 409,
  "message": "The requested identifier already exists."
 }
}

การดำเนินการที่แนะนำ: สร้างรหัสใหม่หากต้องการสร้างอินสแตนซ์ใหม่ หรือใช้การเรียกเมธอด update

409: Conflict

ดำเนินการกับรายการที่จัดกลุ่มภายใน events.batch ไม่ได้เนื่องจากขัดแย้งกับการดำเนินการกับรายการที่จัดกลุ่มอื่นๆ ที่ขอ

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "conflict",
    "message": "Conflict"
   }
  ],
  "code": 409,
  "message": "Conflict"
 }
}

การดำเนินการที่แนะนำ: ยกเว้นรายการที่ประมวลผลสำเร็จทั้งหมดและรายการที่ประมวลผลไม่สำเร็จทั้งหมด และลองอีกครั้งกับรายการที่เหลือในการดำเนินการแบบกลุ่มอื่นevents.batch หรือการดำเนินการแบบเหตุการณ์เดียวที่เกี่ยวข้อง

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 ให้ล้างข้อมูล ร้านค้าและซิงค์อีกครั้ง ดูรายละเอียดเพิ่มเติมได้ที่ ซิงค์ทรัพยากรอย่างมีประสิทธิภาพ สำหรับกิจกรรมที่ลบไปแล้ว คุณไม่ต้องดำเนินการใดๆ เพิ่มเติม

412: เงื่อนไขที่กำหนดไว้ล่วงหน้าล้มเหลว

อีแท็กที่ระบุในส่วนหัว 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 ปัจจุบันข้อผิดพลาดทั้ง 2 รายการนี้ทำงานคล้ายกันและควรได้รับการตอบสนอง ในลักษณะเดียวกันโดยใช้ Exponential Backoff นอกจากนี้ โปรดตรวจสอบว่าแอปเป็นไปตามแนวทางปฏิบัติแนะนำจาก จัดการโควต้า

500: ข้อผิดพลาดที่แบ็กเอนด์

เกิดข้อผิดพลาดที่ไม่คาดคิดขณะประมวลผลคำขอ

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "Backend Error",
   }
  ],
  "code": 500,
  "message": "Backend Error"
 }
}

การดำเนินการที่แนะนำ: ใช้ Exponential Backoff