Ceci est un guide pratique expliquant comment récupérer tous les messages d’un sujet en utilisant l’API Discourse
Les résultats renvoyés par l’API Discourse pour de nombreuses routes sont paginés.
Par exemple, le point de terminaison de l’API pour “Obtenir un seul sujet” - Exemple : https://examplesite/t/{id}.json ne renverra que 20 messages par défaut, même si le sujet contient plus de 20 messages.
En raison de ce comportement, il existe deux façons d’utiliser l’API Discourse pour récupérer tous les messages d’un sujet en utilisant le point de terminaison .../t/{id}.json.
Ajouter un paramètre de requête
La façon la plus simple de récupérer tous les messages d’un sujet consiste à ajouter un paramètre de requête print=true à l’URL vers laquelle vous effectuez la demande.
Exemple : https://examplesite/t/{id}.json?print=true
Lorsque le paramètre de requête print=true est ajouté, Discourse définit la chunk_size (taille du lot) pour le nombre de messages renvoyés à 1000. Cela signifie que cette approche est recommandée tant que vous êtes certain que vos sujets ne contiennent pas plus de 1000 messages.
Plusieurs requêtes API
L’autre méthode pour récupérer tous les messages consiste à effectuer plusieurs requêtes API afin d’obtenir l’intégralité des messages du sujet :
-
Tout d’abord, effectuez une requête
GETinitiale vers le point de terminaison.../t/{id}.json. Cela renverra un hashposts_streamcontenant un tableaupostset un tableaustream. Le tableaupostsvous donnera les 20 premiers messages. -
Vous devez maintenant parcourir le tableau
stream, qui vous fournit tous les identifiants de messages du sujet. Supprimez les 20 premiers identifiants de messages du flux (sinon, vous les téléchargez à nouveau inutilement). -
Vous pouvez ensuite effectuer des requêtes supplémentaires vers le point de terminaison “Obtenir des messages spécifiques d’un sujet”
.../t/{id}/posts.json, ajouterpost_ids[], et transmettre tous les identifiants du tableaustreampar lots de 20. Exemple :.../t/{id}/posts.json?post_ids[]=46&post_ids[]=47&post_ids[]=48&post_ids[]=49&post_ids[]=50&post_ids[]=51&post_ids[]=52&post_ids[]=53&post_ids[]=54&post_ids[]=55&post_ids[]=56&post_ids[]=57&post_ids[]=58&post_ids[]=59&post_ids[]=60&post_ids[]=61&post_ids[]=62&post_ids[]=63&post_ids[]=64&post_ids[]=65
Limites de débit
Si vous rencontrez le message d’erreur Error: you have performed this action many times, please try again later lors de l’exécution de multiples appels API, cela indique que vous avez atteint les limites de débit de votre clé API.
Discourse impose une limite sur le nombre de requêtes print=true pouvant être effectuées par heure, contrôlée par le paramètre du site max prints per hour per user (nombre maximal d’impressions par heure par utilisateur). Ce paramètre est défini par défaut pour autoriser uniquement 5 sujets à être imprimés par heure. La définition de cette valeur à 0 désactive complètement l’impression (les requêtes avec print=true renverront une erreur 403).
Notez que la limite de débit ne sera pas appliquée si l’utilisateur effectuant la requête est un administrateur. Cela signifie que vous pouvez utiliser une clé API avec le nom d’utilisateur d’un administrateur (par exemple system) pour le paramètre Api-Username de la requête afin de contourner la limite de débit d’impression.
Si vous rencontrez des erreurs de limite de débit avec des requêtes API ne contenant pas print=true, nous vous recommandons d’ajouter un délai d’attente (timeout) à votre script API afin de ne pas dépasser les limites de débit. Alternativement, vous pouvez écouter les codes d’erreur 429 (trop de requêtes) et mettre en place une stratégie de réessai avec délai (backoff) lorsque vous recevez cette réponse.
Pour référence, les limites de débit par défaut listées ci-dessous s’appliquent à nos plans d’hébergement standard et entreprise :
Hébergement sur site uniquement - Voir : Available settings for global rate limits and throttling pour les détails sur l’ajustement des limites de débit de l’API Discourse.
