Gérer les erreurs d'API

L'API Calendar renvoie deux niveaux d'erreur:

  • Codes et messages d'erreur HTTP dans l'en-tête
  • Objet JSON dans le corps de la réponse avec des détails supplémentaires qui peuvent vous aider à déterminer comment gérer l'erreur.

Le reste de cette page fournit une référence des erreurs Agenda et explique comment les gérer dans votre application.

Implémenter un intervalle exponentiel entre les tentatives

La documentation des API Cloud explique bien l'intervalle exponentiel entre les tentatives et explique comment l'utiliser avec les API Google.

Erreurs et actions suggérées

Cette section fournit la représentation JSON complète de chaque erreur répertoriée et des suggestions d'actions que vous pouvez effectuer pour la gérer.

400 Bad Request

Erreur de l'utilisateur. Cela peut signifier qu'un champ ou un paramètre obligatoire n'a pas été fourni, que la valeur fournie n'est pas valide ou que la combinaison de champs fournis n'est pas valide.

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

Action suggérée:cette erreur étant définitive, veuillez ne pas réessayer. Lisez plutôt le message d'erreur et modifiez votre demande en conséquence.

401: Identifiants non valides

En-tête d'autorisation non valide. Le jeton d'accès que vous utilisez a expiré ou n'est pas valide.

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

Actions suggérées:

  • Obtenez un nouveau jeton d'accès à l'aide du jeton d'actualisation de longue durée.
  • Si cette opération échoue, redirigez l'utilisateur via le flux OAuth, comme décrit dans la section Autoriser des requêtes avec OAuth 2.0.
  • Si cela concerne un compte de service, vérifiez que vous avez bien effectué toutes les étapes de la page Compte de service.

403: Dépassement de la limite de débit utilisateur

L'une des limites de la Play Console a été atteinte.

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

Actions suggérées:

403: Dépassement de la limite de débit

L'utilisateur a atteint le taux de requêtes maximal par agenda ou utilisateur authentifié de l'API Google Calendar.

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

Action suggérée:les erreurs rateLimitExceeded peuvent renvoyer des codes d'erreur 403 ou 429. Actuellement, leurs fonctionnalités sont similaires et elles doivent être traitées de la même manière en utilisant un intervalle exponentiel entre les tentatives. Assurez-vous également que votre application respecte les bonnes pratiques de gestion des quotas.

403: Limites d'utilisation d'Agenda dépassées

L'utilisateur a atteint l'une des limites de Google Agenda mises en place pour protéger les utilisateurs et l'infrastructure de Google contre les comportements abusifs.

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

Actions suggérées:

403: Interdit aux non-organisateurs

La requête de mise à jour de l'événement tente de définir l'une des propriétés partagées de l'événement dans une copie qui n'est pas celle de l'organisateur. Les propriétés partagées (par exemple, guestsCanInviteOthers, guestsCanModify ou guestsCanSeeOtherGuests) ne peuvent être définies que par l'organisateur.

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

Actions suggérées:

  • Si vous utilisez Events: insert, Events: import ou Events: update, et que votre requête n'inclut aucune propriété partagée, cela revient à essayer de les définir sur leurs valeurs par défaut. Envisagez plutôt d'utiliser Events: patch.
  • Si votre requête contient des propriétés partagées, assurez-vous de ne modifier ces propriétés que si vous mettez à jour la copie de l'organisateur.

404: introuvable

La ressource spécifiée est introuvable. Cela peut se produire dans plusieurs cas. Voici quelques exemples :

  • Lorsque la ressource demandée (avec l'ID fourni) n'a jamais existé
  • lorsqu'il accède à un agenda auquel l'utilisateur ne peut pas accéder

    { "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Introuvable" } ], "code": 404, "message": "Introuvable" } }

Action suggérée:utilisez un intervalle exponentiel entre les tentatives.

409: l'identifiant demandé existe déjà

Une instance portant l'ID indiqué existe déjà dans l'espace de stockage.

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

Action suggérée:générez un nouvel ID si vous souhaitez créer une instance. Sinon, utilisez l'appel de méthode update.

410: Supprimé

Les paramètres syncToken ou updatedMin ne sont plus valides. Cette erreur peut également se produire si une requête tente de supprimer un événement qui a déjà été supprimé.

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

ou

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

ou

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

Action suggérée:Pour les paramètres syncToken ou updatedMin, effacez les données du magasin et resynchronisez-les. Pour en savoir plus, consultez la page Synchroniser les ressources efficacement. Aucune autre action n'est requise pour les événements déjà supprimés.

412: échec de la condition préalable

L'ETag fourni dans l'en-tête If-match ne correspond plus à l'ETag actuel de la ressource.

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

Action suggérée: récupérez à nouveau l'entité et appliquez à nouveau les modifications. Pour en savoir plus, consultez la section Obtenir des versions spécifiques de ressources.

429: trop de requêtes

Une erreur rateLimitExceeded se produit lorsque l'utilisateur a envoyé trop de requêtes au cours d'un certain laps de temps.

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

Action suggérée:les erreurs rateLimitExceeded peuvent renvoyer des codes d'erreur 403 ou 429. Actuellement, leurs fonctionnalités sont similaires et elles doivent être traitées de la même manière en utilisant un intervalle exponentiel entre les tentatives. Assurez-vous également que votre application respecte les bonnes pratiques de gestion des quotas.

500: Erreur du backend

Une erreur inattendue s'est produite lors du traitement de la demande.

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

Action suggérée:utilisez un intervalle exponentiel entre les tentatives.