Calendar API จะแสดงข้อมูลข้อผิดพลาด 2 ระดับ ดังนี้
- รหัสและข้อความแสดงข้อผิดพลาด HTTP ในส่วนหัว
- ออบเจ็กต์ JSON ในส่วนเนื้อหาของการตอบกลับพร้อมรายละเอียดเพิ่มเติมที่จะช่วยคุณกำหนดวิธีจัดการข้อผิดพลาด
ส่วนที่เหลือของหน้านี้จะแสดงข้อมูลอ้างอิงเกี่ยวกับข้อผิดพลาดของปฏิทิน พร้อมคำแนะนำบางส่วนเกี่ยวกับวิธีจัดการข้อผิดพลาดเหล่านั้นในแอป
ใช้ Exponential Backoff
เอกสารประกอบของ Cloud APIs มีคำอธิบายที่ดีเกี่ยวกับการลดจำนวนคำขอแบบทวีคูณและวิธีใช้กับ 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: เกินขีดจำกัดอัตราของผู้ใช้
ใช้ขีดจํากัดอย่างใดอย่างหนึ่งจากคอนโซลของนักพัฒนาแอปถึงขีดจํากัดแล้ว
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "userRateLimitExceeded",
"message": "User Rate Limit Exceeded"
}
],
"code": 403,
"message": "User Rate Limit Exceeded"
}
}
การดำเนินการที่แนะนำมีดังนี้
- ตรวจสอบว่าแอปเป็นไปตามแนวทางปฏิบัติแนะนำจากหัวข้อจัดการโควต้า
- เพิ่มโควต้าต่อผู้ใช้ในโปรเจ็กต์คอนโซลนักพัฒนาซอฟต์แวร์
- หากผู้ใช้รายหนึ่งส่งคำขอจำนวนมากในนามของผู้ใช้บัญชี Google Workspace หลายคน ให้พิจารณาใช้บัญชีบริการที่มีการมอบสิทธิ์ทั่วทั้งโดเมนและตั้งค่าพารามิเตอร์
quotaUser
- ใช้ Exponential Backoff
403: เกินขีดจำกัดของอัตรา
ผู้ใช้ส่งคำขอถึงอัตราสูงสุดของ Google Calendar 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."
}
}
การดำเนินการที่แนะนำมีดังนี้
- หากคุณใช้ 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: เกิดความขัดแย้ง
ดำเนินการกับรายการแบบเป็นกลุ่มภายในการดำเนินการ 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: เงื่อนไขที่กำหนดไว้ล่วงหน้าล้มเหลว
etag ที่ระบุในส่วนหัว If-Match ไม่ตรงกับ etag ปัจจุบันของทรัพยากรอีกต่อไป
{
"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