Обработка ошибок 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."
 }
}

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

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

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