Xử lý lỗi API

API Lịch trả về hai cấp độ thông tin lỗi:

  • Mã lỗi HTTP và thông báo trong tiêu đề
  • Đối tượng JSON trong nội dung phản hồi có các thông tin bổ sung có thể giúp bạn xác định cách xử lý lỗi.

Phần còn lại của trang này cung cấp tài liệu tham khảo về các lỗi Lịch cùng một số hướng dẫn về cách xử lý các lỗi đó trong ứng dụng của bạn.

Triển khai thuật toán thời gian đợi luỹ thừa

Tài liệu về API Cloud có nội dung giải thích rõ ràng về thời gian đợi luỹ thừa và cách sử dụng thuật toán này với các API của Google.

Lỗi và hành động được đề xuất

Phần này cung cấp bản trình bày JSON đầy đủ về từng lỗi được liệt kê và các hành động đề xuất bạn có thể thực hiện để xử lý lỗi.

400: Yêu cầu không hợp lệ

Lỗi người dùng. Điều này có thể có nghĩa là bạn chưa cung cấp trường hoặc tham số bắt buộc, giá trị được cung cấp không hợp lệ hoặc tổ hợp các trường đã cung cấp không hợp lệ.

{
 "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."
 }
}

Hành động đề xuất: Vì đây là lỗi vĩnh viễn, bạn không nên thử lại. Hãy đọc thông báo lỗi và điều chỉnh yêu cầu cho phù hợp.

401: Thông tin xác thực không hợp lệ

Tiêu đề uỷ quyền không hợp lệ. Mã truy cập bạn đang sử dụng đã hết hạn hoặc không hợp lệ.

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "authError",
    "message": "Invalid Credentials",
    "locationType": "header",
    "location": "Authorization",
   }
  ],
  "code": 401,
  "message": "Invalid Credentials"
 }
}

Hành động đề xuất:

  • Nhận mã truy cập mới bằng mã làm mới dài hạn.
  • Nếu quá trình này không thành công, hãy hướng người dùng thông qua quy trình OAuth, như mô tả trong bài viết Uỷ quyền cho yêu cầu bằng OAuth 2.0.
  • Nếu bạn thấy trạng thái này đối với một tài khoản dịch vụ, hãy kiểm tra để đảm bảo rằng bạn đã hoàn tất thành công tất cả các bước trên trang tài khoản dịch vụ.

403: Đã vượt quá giới hạn tốc độ người dùng

Đã đạt đến một trong các giới hạn từ Developer Console.

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

Hành động đề xuất:

403: Đã vượt quá giới hạn tốc độ

Người dùng đã đạt đến tỷ lệ yêu cầu tối đa của API Lịch Google trên mỗi lịch hoặc trên mỗi người dùng đã xác thực.

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

Hành động đề xuất: Lỗi rateLimitExceeded có thể trả về mã lỗi 403 hoặc 429. Hiện tại, các lỗi này có chức năng tương tự nhau và cần được phản hồi theo cách tương tự bằng cách sử dụng tính năng thời gian đợi luỹ thừa. Ngoài ra, hãy đảm bảo ứng dụng của bạn tuân theo các phương pháp hay nhất trong việc quản lý hạn mức.

403: Đã vượt quá giới hạn sử dụng Lịch

Người dùng đã đạt đến một trong các giới hạn hiện có của Lịch Google để bảo vệ người dùng và cơ sở hạ tầng của Google khỏi hành vi sai trái.

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

Hành động đề xuất:

403: Cấm người không tổ chức

Yêu cầu cập nhật sự kiện đang cố gắng đặt một trong các thuộc tính sự kiện được chia sẻ trong một bản sao không phải của người tổ chức. Chỉ người tổ chức mới có thể đặt các thuộc tính dùng chung (ví dụ: guestsCanInviteOthers, guestsCanModify hoặc 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."
 }
}

Hành động đề xuất:

  • Nếu bạn đang sử dụng Sự kiện: chèn, Sự kiện: nhập hoặc Sự kiện: cập nhật và yêu cầu của bạn không bao gồm bất kỳ thuộc tính dùng chung nào, điều này tương đương với việc cố gắng đặt sự kiện thành giá trị mặc định. Thay vào đó, hãy cân nhắc sử dụng Events: patch (Sự kiện: bản vá).
  • Nếu yêu cầu của bạn có các thuộc tính dùng chung, hãy đảm bảo rằng bạn chỉ đang cố gắng thay đổi các thuộc tính này nếu bạn đang cập nhật bản sao của người tổ chức.

404: Không tìm thấy

Không tìm thấy tài nguyên được chỉ định. Lỗi này có thể xảy ra trong một số trường hợp. Sau đây là một số ví dụ:

  • khi tài nguyên được yêu cầu (có mã nhận dạng được cung cấp) chưa từng tồn tại
  • khi truy cập vào lịch mà người dùng không truy cập được

    { "error": { " errors": [ { "domain": "global", "reason": "notFound", "message": "Không tìm thấy" } ], "code": 404, "message": "Không tìm thấy" } }

Hành động đề xuất: Sử dụng tính năng thời gian đợi luỹ thừa.

409: Đã tồn tại giá trị nhận dạng được yêu cầu

Đã tồn tại một thực thể có mã nhận dạng được cung cấp trong bộ nhớ.

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

Hành động đề xuất: Tạo mã nhận dạng mới nếu bạn muốn tạo một thực thể mới, nếu không, hãy sử dụng lệnh gọi phương thức update.

410: Đã qua

Các tham số syncToken hoặc updatedMin không còn hợp lệ. Lỗi này cũng có thể xảy ra nếu một yêu cầu cố gắng xoá một sự kiện đã bị xoá.

{
 "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."
 }
}

hoặc

{
 "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."
 }
}

hoặc

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "deleted",
    "message": "Resource has been deleted"
   }
  ],
  "code": 410,
  "message": "Resource has been deleted"
 }
}

Hành động đề xuất: Đối với các tham số syncToken hoặc updatedMin, hãy xoá sạch cửa hàng rồi đồng bộ hoá lại. Để biết thêm thông tin chi tiết, hãy xem phần Đồng bộ hoá tài nguyên hiệu quả. Đối với những sự kiện đã xoá, bạn không cần làm gì thêm.

412: Điều kiện tiên quyết bị lỗi

Etag được cung cấp trong tiêu đề If-match không còn tương ứng với etag hiện tại của tài nguyên.

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "conditionNotMet",
    "message": "Precondition Failed",
    "locationType": "header",
    "location": "If-Match",
    }
  ],
  "code": 412,
  "message": "Precondition Failed"
 }
}

Hành động được đề xuất: Tìm nạp lại thực thể và áp dụng lại các thay đổi. Để biết thêm thông tin chi tiết, hãy xem phần Tải các phiên bản tài nguyên cụ thể.

429: Quá nhiều yêu cầu

Lỗi rateLimitExceeded xảy ra khi người dùng gửi quá nhiều yêu cầu trong một khoảng thời gian nhất định.

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

Hành động đề xuất: Lỗi rateLimitExceeded có thể trả về mã lỗi 403 hoặc 429. Hiện tại, các lỗi này có chức năng tương tự nhau và cần được phản hồi theo cách tương tự bằng cách sử dụng tính năng thời gian đợi luỹ thừa. Ngoài ra, hãy đảm bảo ứng dụng của bạn tuân theo các phương pháp hay nhất trong việc quản lý hạn mức.

500: Lỗi phụ trợ

Đã xảy ra lỗi không mong muốn khi xử lý yêu cầu.

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

Hành động đề xuất: Sử dụng tính năng thời gian đợi luỹ thừa.