Gérer les erreurs d'API

L'API Calendar renvoie deux niveaux d'informations d'erreur:

  • Codes et messages d'erreur HTTP dans l'en-tête
  • Un objet JSON dans le corps de la réponse avec des informations 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 de calendrier, avec des conseils sur la façon de les gérer dans votre application.

Implémenter l'intervalle exponentiel entre les tentatives

La documentation des API Cloud explique bien le délai avant expiration exponentiel et comment l'utiliser avec les API Google.

Erreurs et suggestions d'actions

Cette section fournit la représentation JSON complète de chaque erreur listée et les 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 des 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:Étant donné qu'il s'agit d'une erreur permanente, n'effectuez aucune nouvelle tentative. Lisez plutôt le message d'erreur et modifiez votre requête en conséquence.

401: Identifiants incorrects

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 cela échoue, guidez l'utilisateur à travers le flux OAuth, comme décrit dans la section Autoriser les requêtes avec OAuth 2.0.
  • Si ce message s'affiche pour un compte de service, vérifiez que vous avez bien suivi toutes les étapes de la page des comptes de service.

403: Limite de débit par utilisateur dépassée

Vous avez atteint l'une des limites de la Developer Console.

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

Actions suggérées:

403: Limite de débit dépassée

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

{
 "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, elles sont fonctionnellement similaires et doivent être traitées de la même manière, à l'aide d'un intervalle exponentiel entre les tentatives. Assurez-vous également que votre application respecte les bonnes pratiques de la section Gérer les 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 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: Accès interdit pour les utilisateurs qui ne sont pas organisateurs

La demande de mise à jour de l'événement tente de définir l'une des propriétés d'événement partagées 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 équivaut à essayer de les définir sur leurs valeurs par défaut. Pensez plutôt à utiliser Events: patch.
  • Si votre requête comporte des propriétés partagées, assurez-vous de ne tenter de les modifier 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é
  • lors de l'accès à un agenda auquel l'utilisateur n'a pas accès ;

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

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

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

Une instance avec l'ID donné existe déjà dans le 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 la méthode update.

409 Conflict

Un élément groupé dans une opération events.batch ne peut pas être exécuté en raison d'un conflit opérationnel avec d'autres éléments groupés demandés.

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "conflict",
    "message": "Conflict"
   }
  ],
  "code": 409,
  "message": "Conflict"
 }
}

Action suggérée:excluez tous les éléments de lot terminés avec succès et tous ceux qui ont définitivement échoué, puis réessayez les éléments restants dans une autre events.batch ou des opérations d'événement unique correspondantes.

410: Indisponible

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 déjà 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 le magasin et effectuez une resynchronisation. Pour en savoir plus, consultez Synchroniser efficacement les ressources. 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 réappliquez les modifications. Pour en savoir plus, consultez 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 dans un délai donné.

{
  "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, elles sont fonctionnellement similaires et doivent être traitées de la même manière, à l'aide d'un intervalle exponentiel entre les tentatives. Assurez-vous également que votre application respecte les bonnes pratiques de la section Gérer les quotas.

500: Erreur de backend

Une erreur inattendue s'est produite lors du traitement de la requête.

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