Calendar API trả về 2 cấp thông tin lỗi:
- Mã lỗi và thông báo lỗi HTTP trong tiêu đề
- Một đối tượng JSON trong nội dung phản hồi có thông tin chi tiết 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 thông tin tham khảo về các lỗi liên quan đến Lịch, kèm theo 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ề Cloud API giải thích rõ ràng về việc giảm thời gian chờ luỹ thừa và cách sử dụng tính năng 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 thông tin đầy đủ về JSON của từng lỗi được liệt kê và các hành động được đề xuất mà 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 một 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 được 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 được đề xuất: Vì đây là lỗi vĩnh viễn, nên bạn không cần thử lại. Hãy đọc thông báo lỗi và thay đổi yêu cầu của bạn cho phù hợp.
401: Thông tin đăng nhập không hợp lệ
Tiêu đề uỷ quyền không hợp lệ. Mã thông báo truy cập bạn đang 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:
- Lấy mã truy cập mới bằng mã làm mới có thời hạn sử dụng lâu dài.
- Nếu không thành công, hãy hướng dẫn người dùng thực hiện quy trình OAuth, như mô tả trong phần Uỷ quyền cho các yêu cầu bằng OAuth 2.0.
- Nếu bạn đang thấy thông báo này cho 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 tất cả các bước trong trang tài khoản dịch vụ.
403: Đã vượt quá giới hạn tần suất của người dùng
Đã đạt đến một trong các giới hạn của 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:
- Đảm bảo ứng dụng của bạn tuân thủ các phương pháp hay nhất trong phần quản lý hạn mức.
- Tăng hạn mức trên mỗi người dùng trong dự án trên Developer Console.
- Nếu một người dùng đang thực hiện nhiều yêu cầu thay mặt cho nhiều người dùng của tài khoản Google Workspace, hãy cân nhắc sử dụng tài khoản dịch vụ có uỷ quyền trên toàn miền và đặt tham số
quotaUser
. - Sử dụng thuật toán đợi luỹ tuyến.
403: Đã vượt quá giới hạn tần suất
Người dùng đã đạt đến tốc độ yêu cầu tối đa của Google Calendar API cho mỗi lịch hoặc 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 mã lỗi này có chức năng tương tự nhau và bạn nên phản hồi theo cùng một cách, bằng cách sử dụ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 thủ các phương pháp hay nhất trong phần quản lý hạn mức.
403: Đã vượt quá hạn mức sử dụng Lịch
Người dùng đã đạt đến một trong những hạn mức của Lịch Google nhằm 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:
- Đọc thêm về hạn mức sử dụng Lịch trong phần Trợ giúp dành cho quản trị viên Google Workspace.
403: Bị cấm đối với người không phải là người 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. Người tổ chức chỉ 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 Events: insert, Events: import hoặc Events: update và yêu cầu của bạn không bao gồm bất kỳ thuộc tính nào được chia sẻ, thì điều này tương đương với việc cố gắng đặt các thuộc tính đó thành giá trị mặc định. Hãy cân nhắc sử dụng Events: patch (Sự kiện: vá) thay thế.
- Nếu yêu cầu của bạn có các thuộc tính được chia sẻ, 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. Điều này có thể xảy ra trong một số trường hợp. Dưới đâ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 một lịch mà người dùng không thể truy cập
{ "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Not Found" } ], "code": 404, "message": "Not Found" } }
Hành động được đề xuất: Sử dụng thời gian đợi tăng theo cấp luỹ thừa.
409: Giá trị nhận dạng được yêu cầu đã tồn tại
Đã có một thực thể có mã nhận dạng đã cho 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 được đề xuất: Tạo một mã nhận dạng mới nếu bạn muốn tạo một phiên bản mới, nếu không, hãy sử dụng lệnh gọi phương thức update.
409: Xung đột
Không thể thực thi một mục theo lô trong thao tác events.batch
do xung đột về hoạt động với các mục theo lô được yêu cầu khác.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "conflict",
"message": "Conflict"
}
],
"code": 409,
"message": "Conflict"
}
}
Hành động được đề xuất: Loại trừ tất cả các mục theo lô đã hoàn tất thành công và tất cả các mục theo lô chắc chắn không thành công, đồng thời thử lại các mục còn lại trong một events.batch
khác hoặc các thao tác tương ứng với một sự kiện.
410: Không tồn tại
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 tìm cách 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á dữ liệu trong bộ nhớ và đồng bộ hoá lại. Để biết thêm thông tin, hãy xem phần Đồng bộ hoá tài nguyên một cách hiệu quả.
Đối với những sự kiện đã bị 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 nữa.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "conditionNotMet",
"message": "Precondition Failed",
"locationType": "header",
"location": "If-Match",
}
],
"code": 412,
"message": "Precondition Failed"
}
}
Hành động đề 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 Lấy các phiên bản cụ thể của tài nguyên.
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 mã lỗi này có chức năng tương tự nhau và bạn nên phản hồi theo cùng một cách, bằng cách sử dụ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 thủ các phương pháp hay nhất trong phần quản lý hạn mức.
500: Lỗi trong chương trình phụ trợ
Đã xảy ra lỗi ngoài dự kiến trong khi xử lý yêu cầu.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "Backend Error",
}
],
"code": 500,
"message": "Backend Error"
}
}
Hành động được đề xuất: Sử dụng thời gian đợi tăng theo cấp luỹ thừa.