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

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

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

На этой странице представлен справочник по ошибкам календаря, а также некоторые рекомендации по их обработке в вашем приложении.

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

В документации Google Cloud Storage объясняется принцип экспоненциальной задержки и как использовать его с 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: Превышен лимит запросов пользователей

Достигнут один из лимитов в консоли Google Cloud.

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

Рекомендуемые действия:

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

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

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

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

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

Пользователь превысил один из лимитов календаря, установленных для защиты пользователей и инфраструктуры 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: Не найдено

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

  • Когда запрошенный ресурс (с указанным идентификатором) никогда не существовал.
  • При попытке доступа к календарю, к которому пользователь не имеет доступа.
{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "notFound",
        "message": "Not Found"
      }
    ],
    "code": 404,
    "message": "Not Found"
  }
}

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

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

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

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

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

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

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

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

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