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"
}
}
Предлагаемые действия:
- Получите новый токен доступа, используя долгосрочный токен обновления.
- Если это не помогло, направьте пользователя через поток OAuth, как описано в разделе Авторизация запросов с помощью OAuth 2.0 .
- Если вы видите это для учетной записи службы, убедитесь, что вы успешно выполнили все шаги на странице учетной записи службы .
403: Превышен лимит скорости пользователя
Достигнуто одно из ограничений консоли разработчика.
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "userRateLimitExceeded",
"message": "User Rate Limit Exceeded"
}
],
"code": 403,
"message": "User Rate Limit Exceeded"
}
}
Предлагаемые действия:
- Убедитесь, что ваше приложение соответствует рекомендациям по управлению квотами .
- Увеличьте квоту для каждого пользователя в проекте Developer Console.
- Если один пользователь делает много запросов от имени многих пользователей аккаунта 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: Не найден
Указанный ресурс не найден. Это может произойти в нескольких случаях. Вот несколько примеров:
- когда запрошенный ресурс (с предоставленным идентификатором) никогда не существовал
при доступе к календарю, к которому пользователь не имеет доступа
{ "ошибка": { "ошибки": [ { "домен": "глобальный", "причина": "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"
}
}
Предлагаемое действие: используйте экспоненциальную отсрочку .