Maneja errores de API

La API de Calendar muestra dos niveles de información de errores:

  • Códigos de error de HTTP y mensajes en el encabezado
  • Un objeto JSON en el cuerpo de la respuesta con detalles adicionales que pueden ayudarte a determinar cómo manejar el error

En el resto de esta página, se proporciona una referencia de los errores de Calendario con orientación para solucionarlos en tu app.

Implementa una retirada exponencial

La documentación de las APIs de Cloud contiene una buena explicación de la retirada exponencial y cómo usarla con las APIs de Google.

Errores y acciones sugeridas

En esta sección, se proporciona la representación completa de JSON de cada error enumerado y las acciones sugeridas que puedes realizar para solucionarlo.

400: Bad Request

Error del usuario. Esto puede significar que no se proporcionó un campo o parámetro obligatorio, que el valor proporcionado no es válido o que la combinación de campos proporcionados no es válida.

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

Acción sugerida: Dado que se trata de un error permanente, no vuelvas a intentarlo. Lee el mensaje de error y cambia la solicitud según corresponda.

401: Credenciales no válidas

El encabezado de autorización no es válido. El token de acceso que estás usando está vencido o no es válido.

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "authError",
    "message": "Invalid Credentials",
    "locationType": "header",
    "location": "Authorization",
   }
  ],
  "code": 401,
  "message": "Invalid Credentials"
 }
}

Acciones sugeridas:

  • Obtén un token de acceso nuevo con el token de actualización de larga duración.
  • Si esto falla, dirige al usuario a través del flujo de OAuth, como se describe en Autoriza solicitudes con OAuth 2.0.
  • Si ves esto en una cuenta de servicio, verifica si completaste todos los pasos de forma correcta en la página de la cuenta de servicio.

403: Se superó el límite de frecuencia de usuarios

Se alcanzó uno de los límites de Play Console.

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

Acciones sugeridas:

403: Límite de tasa excedido

El usuario alcanzó la tasa máxima de solicitudes por calendario o por usuario autenticado de la API de Calendario de Google.

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

Acción sugerida: Los errores rateLimitExceeded pueden mostrar códigos de error 403 o 429. Por el momento, son similares en cuanto a sus funciones y se deben responder de la misma manera mediante una retirada exponencial. Además, asegúrate de que tu app siga las prácticas recomendadas de la administración de cuotas.

403: Se excedieron los límites de uso del Calendario

El usuario alcanzó uno de los límites del Calendario de Google establecidos para proteger a los usuarios y la infraestructura de Google de comportamientos abusivos.

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

Acciones sugeridas:

403: Prohibido para organización sin organización

La solicitud de actualización del evento intenta establecer una de las propiedades del evento compartida en una copia que no pertenece al organizador. Solo el organizador puede configurar las propiedades compartidas (por ejemplo, guestsCanInviteOthers, guestsCanModify o 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."
 }
}

Acciones sugeridas:

  • Si usas Events: insert, Events: import o Events: update y tu solicitud no incluye ninguna propiedad compartida, esto equivale a intentar establecerlas en sus valores predeterminados. En su lugar, considera usar Events: patch.
  • Si tu solicitud tiene propiedades compartidas, asegúrate de intentar cambiar estas propiedades solo si estás actualizando la copia del organizador.

404: No encontrado

No se encontró el recurso especificado. Esto puede suceder en varios casos. Estos son algunos ejemplos:

  • Cuando el recurso solicitado (con el ID proporcionado) nunca existió
  • cuando se accede a un calendario al que el usuario no puede acceder

    { "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "No encontrado" } ], "code": 404, "message": "No se encontró" } }

Acción sugerida: Usa la retirada exponencial.

409: El identificador solicitado ya existe

Ya existe una instancia con este ID en el almacenamiento.

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

Acción sugerida: Genera un ID nuevo si deseas crear una instancia nueva. De lo contrario, usa la llamada al método update.

410: No disponible

Los parámetros syncToken o updatedMin ya no son válidos. Este error también puede ocurrir si una solicitud intenta borrar un evento que ya se borró.

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

o

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

o

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "deleted",
    "message": "Resource has been deleted"
   }
  ],
  "code": 410,
  "message": "Resource has been deleted"
 }
}

Acción sugerida: Para los parámetros syncToken o updatedMin, limpia el almacén y vuelve a sincronizar. Para obtener más detalles, consulta Cómo sincronizar recursos de manera eficiente. En el caso de los eventos ya eliminados, no es necesario realizar ninguna otra acción.

412: Precondition Failed (error de condición previa)

La ETag proporcionada en el encabezado If-match ya no corresponde a la ETag actual del recurso.

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "conditionNotMet",
    "message": "Precondition Failed",
    "locationType": "header",
    "location": "If-Match",
    }
  ],
  "code": 412,
  "message": "Precondition Failed"
 }
}

Acción sugerida: Vuelve a recuperar la entidad y aplicar los cambios de nuevo. Para obtener más detalles, consulta Cómo obtener versiones específicas de los recursos.

429: Demasiadas solicitudes

Se produce un error rateLimitExceeded cuando el usuario envía demasiadas solicitudes en un período determinado.

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

Acción sugerida: Los errores rateLimitExceeded pueden mostrar códigos de error 403 o 429. Por el momento, son similares en cuanto a sus funciones y se deben responder de la misma manera mediante una retirada exponencial. Además, asegúrate de que tu app siga las prácticas recomendadas de la administración de cuotas.

500: Error de backend

Se produjo un error inesperado cuando se procesaba la solicitud.

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

Acción sugerida: Usa la retirada exponencial.