Comment gérer les erreurs
Comment gérer les erreurs
Présentation
Ce guide couvre la gestion des erreurs lors de l’interaction avec l’API C2C. Une bonne gestion des erreurs HTTP est essentielle pour une intégration robuste avec tout service tiers.
Types d’erreurs
Dans votre intégration, les erreurs peuvent provenir de diverses sources, que nous pouvons classer en quatre groupes principaux :
- Erreurs d’E/S : proviennent d’opérations matérielles sur votre appareil, comme des opérations de lecture/écriture ayant échoué.
- Erreurs d’application : résultent de problèmes dans le code de votre application.
- Erreurs réseau : se produisent dans la pile réseau et sont communiquées par votre bibliothèque réseau.
- Erreurs d’API : générées par les services backend de Frame.io.
Chaque catégorie d’erreur nécessite une gestion spécifique. Ce guide se concentre principalement sur les erreurs d’API, bien que nous abordions également des stratégies générales pour les autres catégories.
Renvoi des erreurs d’API
L’API Frame.io communique les erreurs par le biais de deux mécanismes principaux :
- Codes d’état : codes d’erreur HTTP qui indiquent la nature du problème.
- Messages d’erreur : contenu de payload qui fournit des détails d’erreur supplémentaires, en particulier lorsque plusieurs conditions d’erreur partagent le même code d’état.
Codes d’état d’erreur
Les codes d’état HTTP sont des réponses numériques standardisées qui communiquent le résultat d’une requête HTTP. Pour plus d’informations, consultez la documentation sur les codes d’état HTTP de Mozilla ou HTTP Cats pour une approche plus visuelle. Chaque point d’entrée de l’API Frame.io spécifie un code d’état de réussite attendu, généralement 200 (OK), 201 (Created) ou 204 (No Content). Vous pouvez vérifier la réussite de deux manières : en recherchant ces codes spécifiques ou en confirmant que le code se situe dans la plage 200-299. Les codes d’état supérieurs à 399 indiquent des erreurs. La plupart des erreurs d’API renvoient des codes 4XX (400-499), ce qui indique des problèmes côté client. Les erreurs en dehors de cette plage proviennent généralement de l’infrastructure réseau entre votre appareil et notre service, à l’exception notable de 500 (Erreur de serveur interne), qui indique un problème inattendu au sein de notre serveur. De même, une réponse 404 (Not Found) peut être générée par des services intermédiaires plutôt que par notre backend, bien qu’il s’agisse d’un code 4XX.
Si vous rencontrez des codes d’état inattendus, veuillez en informer notre équipe.
Schémas de payload d’erreur
Frame.io retourne les détails d’erreur dans deux formats : simple et détaillé. Votre logique de gestion des erreurs doit prendre en charge les deux formats.
Schéma d’erreur simple
Voici un exemple de requête échouée avec un client_secret incorrect :
Réponse :
Le schéma simple contient un seul champ pour l’identification de l’erreur.
Schéma d’erreur détaillé
À titre de comparaison, voici une requête sans autorisation appropriée :
Réponse :
Les erreurs détaillées contiennent un champ message qui identifie le type d’erreur.
Détermination du type d’erreur
Lors de la gestion des erreurs Frame.io, vérifiez d’abord la présence d’une payload d’erreur, puis utilisez le code de statut HTTP comme solution de repli si aucune payload n’est présente.
Voici une implémentation de base de la gestion des erreurs :
Les tables de recherche d’erreur référencées dans cet exemple sont fournies à la fin de ce guide.
Erreurs AWS
Lors du chargement de blocs de fichiers, vous interagissez directement avec AWS S3, qui a son propre format d’erreur. Consultez la documentation sur les erreurs courantes d’AWS pour plus de détails. En règle générale, les erreurs AWS non fatales nécessitent au moins une nouvelle tentative.
Les erreurs AWS sont retournées au format XML :
L’élément Code identifie le type d’erreur.
Nouvelle tentative en cas d’erreur
Quand effectuer une nouvelle tentative
Les tableaux d’erreurs contenus dans ce guide indiquent quelles erreurs d’API doivent faire l’objet d’une nouvelle tentative. Pour les erreurs non liées à l’API provenant d’opérations d’E/S, de bibliothèques de mise en réseau ou d’AWS, envisagez d’effectuer une nouvelle tentative pour celles qui peuvent résulter de conditions transitoires. La congestion du réseau, les pannes temporaires de serveur ou la perte de paquets justifient généralement d’effectuer une nouvelle tentative. La plupart des bibliothèques de mise en réseau déclenchent l’erreur TimeoutError lorsqu’une requête prend trop de temps, ce qui constitue une raison idéale d’effectuer une nouvelle tentative.
En cas de doute, effectuez une nouvelle tentative
Les environnements informatiques peuvent connaître des problèmes imprévisibles. Même avec des erreurs qui semblent fatales, il vaut souvent la peine de faire une nouvelle tentative. Les états temporaires du système, les anomalies matérielles (telles que les inversions de bits dues aux rayons cosmiques) ou les conditions de mémoire rares peuvent provoquer des erreurs apparemment fatales qui se résolvent lors d’une seconde tentative. Certaines erreurs, cependant, ne doivent pas faire l’objet d’une nouvelle tentative. Par exemple, une réponse 409: CANAL SUSPENDU lors de la création d’une ressource indique que l’appareil est en pause et ne doit pas charger. Cet état est délibéré et peu susceptible de changer suite à une nouvelle tentative.
Temporisation exponentielle
Frame.io implémente une limitation du taux de requêtes. Le dépassement de ces limites produit soit une erreur 429 : Ralentissement, soit un statut 400 avec cette payload :
Lorsque vous recevez ces réponses, mettez en œuvre une temporisation exponentielle pour les nouvelles tentatives. Voici une formule recommandée pour calculer le délai (en secondes) :
Où attempt commence à 0. Cela produit des délais de 0,5 s, 1 s, 2 s, 4 s, 8 s, 16 s, 32 s, toutes les tentatives suivantes attendant 32 secondes.
Variation de temporisation
Nous recommandons d’ajouter un caractère aléatoire (variation) à votre temporisation pour éviter la synchronisation des requêtes entre plusieurs appareils se remettant de la même condition d’erreur. Cela aide à atténuer le phénomène de débandade lorsque de nombreux appareils effectuent simultanément une nouvelle tentative après une panne. Ajouter un décalage aléatoire entre 0 et la moitié du délai calculé constitue une bonne approche : math.rand(0, delay // 2).
Bien que la temporisation exponentielle soit essentielle pour les erreurs limitant le taux de requêtes, elle est également bénéfique pour gérer les pannes de réseau et d’E/S en général. Cette approche permet de résoudre les contraintes temporaires liées aux ressources sans charge supplémentaire provenant de vos nouvelles tentatives.
Détection du statut Déconnecté
Les erreurs réseau peuvent indiquer que Frame.io est inaccessible pour les raisons suivantes :
- le réseau local est en panne ;
- les services Frame.io rencontrent des problèmes ;
- un composant réseau intermédiaire est défaillant.
Il est important de détecter ces conditions. Lorsqu’une erreur suggère des problèmes de connectivité, implémentez une tâche de surveillance qui vérifie la restauration du service et informe l’utilisateur de la déconnexion.
Attente de connexion et d’autorisation
Concevez l’application de manière à éviter les requêtes inutiles lorsque l’appareil actualise l’autorisation, attend l’autorisation de l’utilisateur ou ne peut pas atteindre Frame.io. Ceci réduit la surcharge réseau et améliore l’expérience client.
Bloquez tous les appels d’API (sauf vers https://api.frame.io/health) lorsque vous détectez un état de déconnexion. Lorsque des problèmes de connectivité surviennent, démarrez une tâche en arrière-plan qui enquête sur le point d’entrée d’intégrité et bloque les autres appels API jusqu’à ce que la connectivité soit restaurée.
De même, si le jeton expire, bloquez les appels dépendants de l’autorisation jusqu’à ce qu’un nouveau jeton soit émis. Si l’actualisation du jeton échoue, avertissez l’utilisateur afin qu’il s’authentifie de nouveau.
Lors de l’enquête sur le statut de connexion, appliquez la même approche de temporisation exponentielle décrite précédemment.
Délais d’expiration des requêtes
Configurez des valeurs de délai d’expiration appropriées pour différents types de requêtes :
- Par défaut : 15 secondes pour les requêtes de base
- Actualisation d’autorisation : 2 minutes pour tenir compte du traitement potentiel du backend
- Chargement de bloc de fichier : 5 minutes pour accommoder les réseaux lents lors du transfert de données plus volumineuses
Exemple de gestion de nouvelle tentative
Voici une implémentation en pseudocode montrant la gestion d’erreur avec temporisation exponentielle :
Tableaux d’erreurs
Les tableaux suivants catégorisent les erreurs de l’API Frame.io et fournissent des conseils de gestion. Voici ce que représente chaque colonne :
message : identifiant du message de payload d’erreur code http : code d’état HTTP type d’erreur : catégorie d’erreur conceptuelle (détaillée dans la section descriptions) schéma : format de payload d’erreur (simple ou détaillé) nouvelle tentative : recommandation de nouvelle tentative (oui pour plusieurs tentatives, une fois pour une seule nouvelle tentative, non pour les erreurs fatales). Les astérisques (*) indiquent des considérations spéciales détaillées dans la section descriptions.
Messages d’erreur Frame.io
Codes d’état de Frame.io
Erreurs AWS
Consultez la documentation d’AWS pour des descriptions détaillées.
Analyse des erreurs AWS similaires
Les erreurs SlowDown et ServiceUnavailable d’AWS indiquent toutes deux des problèmes de taux de requête et peuvent être traitées de manière semblable à l’erreur SlowDown de Frame.io, en implémentant une temporisation exponentielle. De même, l’erreur InternalError d’AWS correspond conceptuellement à InternalServerError dans notre API.
Descriptions
AccessDenied
Renvoyée lorsqu’un utilisateur refuse l’autorisation pendant le couplage de l’appareil.
AuthorizationPending
Indique qu’un utilisateur n’a pas encore saisi le code de couplage de l’appareil. Poursuivez l’interrogation après le délai interval spécifié dans la réponse du code d’appareil.
ChannelPaused
Le canal de l’appareil a été mis en pause lors de la création de la ressource. Ne tentez pas de charger à nouveau cette ressource.
ExpiredToken
Le code de couplage de l’appareil a expiré. Générez un nouveau code et relancez le processus de couplage.
InternalServerError
Indique un problème de serveur inattendu. Réessayez une fois et signalez les erreurs 500 à notre équipe pour enquête. Notez que certains problèmes connus renvoient des erreurs 500 alors qu’ils devraient renvoyer l’erreur InvalidRequest :
- Tentative de chargement vers un canal d’appareil inexistant
- Demande d’un nombre de blocs personnalisé non valide
InvalidArgument
Un paramètre de payload contenait une valeur non valide. Vérifiez que les valeurs des paramètres correspondent aux attentes de l’API.
InvalidContentType
L’en-tête Content-Type de la requête n’est pas pris en charge. L’API accepte généralement :
form/multipart(points d’entrée d’autorisation uniquement)application/x-www-form-urlencoded(tous les points d’entrée)application/json(points d’entrée hors autorisation)
InvalidClient
Les informations d’identification fournies (client_id, client_secret, etc.) n’ont pas été reconnues. Vérifiez les informations d’identification de votre intégration.
InvalidClientVersion
L’en-tête x-client-version était dupliqué ou contenait une version sémantique non valide.
InvalidGrant
Le type d’octroi d’autorisation n’est pas valide. Vérifiez les guides d’autorisation pour connaître les valeurs correctes.
InvalidRequest
Les paramètres de la demande ou le format du payload sont incorrects. Vérifiez les noms des champs et les formats des valeurs.
Si vous recevez cette erreur lors de l’actualisation du jeton, cela signifie que votre jeton d’actualisation a expiré et que vous devez redémarrer le processus d’autorisation.
SlowDown
Vous avez dépassé les limites de taux de requête. Implémentez une temporisation exponentielle pour les requêtes suivantes. Notez que créer plusieurs requêtes de code d’appareil sur la même connexion TCP peut déclencher cette erreur. Créez de nouvelles connexions pour chaque demande de couplage.
UnauthorizedClient
Indique généralement un access_token expiré ou manquant. Si vous recevez cette erreur, actualisez le jeton avant de réessayer.
Si cette erreur se produit lors de l’actualisation du jeton, vous devez redémarrer le processus d’autorisation et demander à l’utilisateur de se reconnecter.
Cette erreur peut également se produire lors de l’accès à des ressources situées hors de la portée d’autorisation de l’appareil ou lorsqu’un projet a désactivé les appareils C2C. Vérifiez que vous avez demandé les portées appropriées lors de l’autorisation.
Si cette erreur se produit lors de l’actualisation du jeton, l’ensemble du processus d’autorisation doit être redémarré avec une intervention de l’utilisateur.
Étapes suivantes
Nous vous encourageons à contacter l’équipe pour toute question et à consulter le guide de chargement avancé. Nous nous ferons un plaisir de vous aider à faire avancer votre intégration. Si vous ne l’avez pas encore fait, veuillez consulter le guide Implémentation C2C : configuration avant de continuer. Vous aurez besoin de l’élément access_token obtenu au cours du processus d’authentification et d’autorisation. Ce guide s’appuie sur le guide de chargement de base et le guide de chargement avancé.