Обработка ошибок API

API календаря возвращает два уровня информации об ошибках:

  • Коды ошибок HTTP и сообщения в заголовке
  • Объект JSON в тексте ответа с дополнительными сведениями, которые помогут вам определить, как обработать ошибку.

Остальная часть этой страницы содержит информацию об ошибках Календаря и некоторые рекомендации по их устранению в вашем приложении.

Реализуйте экспоненциальную отсрочку

В документации по Cloud API есть хорошее объяснение экспоненциальной задержки и способов ее использования с API Google.

Ошибки и рекомендуемые действия

В этом разделе представлено полное 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"
 }
}

Предлагаемые действия:

403: Превышен лимит скорости пользователя

Достигнуто одно из ограничений консоли разработчика.

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

Предлагаемые действия:

403: Превышен лимит скорости

Пользователь достиг максимальной частоты запросов API Календаря Google для каждого календаря или для каждого аутентифицированного пользователя.

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

Предлагаемое действие: rateLimitExceeded могут возвращать коды ошибок 403 или 429 — в настоящее время они функционально схожи, и на них следует реагировать одинаково, используя экспоненциальную отсрочку . Кроме того, убедитесь, что ваше приложение соответствует рекомендациям по управлению квотами .

403: превышены ограничения на использование календаря.

Пользователь достиг одного из ограничений Календаря Google, установленных для защиты пользователей и инфраструктуры Google от оскорбительного поведения.

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

Предлагаемые действия:

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: Не найден

Указанный ресурс не найден. Это может произойти в нескольких случаях. Вот несколько примеров:

  • когда запрошенный ресурс (с предоставленным идентификатором) никогда не существовал
  • при доступе к календарю, к которому пользователь не имеет доступа

    { "ошибка": { "ошибки": [ { "домен": "глобальный", "причина": "notFound", "сообщение": "не найдено" } ], "код": 404, "сообщение": " Не найдено" } }

Предлагаемое действие: используйте экспоненциальную отсрочку .

409: Запрошенный идентификатор уже существует.

Экземпляр с данным идентификатором уже существует в хранилище.

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

Предлагаемое действие: создайте новый идентификатор, если вы хотите создать новый экземпляр, в противном случае используйте вызов метода обновления .

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 — в настоящее время они функционально схожи, и на них следует реагировать одинаково, используя экспоненциальную отсрочку . Кроме того, убедитесь, что ваше приложение соответствует рекомендациям по управлению квотами .

500: Ошибка серверной части

При обработке запроса произошла непредвиденная ошибка.

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

Предлагаемое действие: используйте экспоненциальную отсрочку .