API календаря возвращает информацию об ошибках двух уровней:
- Коды ошибок и сообщения HTTP в заголовке
- В теле ответа содержится JSON-объект с дополнительными сведениями, которые помогут определить, как обработать ошибку.
На этой странице также представлен справочник по ошибкам календаря и некоторые рекомендации по их обработке в вашем приложении.
Реализуйте экспоненциальную задержку.
В документации по Cloud APIs содержится хорошее объяснение экспоненциальной задержки и того, как использовать её с 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"
}
}
Рекомендуемые действия:
- Получите новый токен доступа, используя долгосрочный токен обновления.
- Если это не удастся, направьте пользователя через процесс 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. - Используйте экспоненциальную задержку .
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."
}
}
Рекомендуемые действия:
- Подробнее об ограничениях на использование календаря можно прочитать в справке администратора 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" } }
Рекомендуемое действие: использовать экспоненциальную задержку .
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: Предварительное условие не выполнено
Указанный в заголовке If-match etag больше не соответствует текущему 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"
}
}
Рекомендуемое действие: использовать экспоненциальную задержку .