Esta es una guía paso a paso que explica cómo obtener todas las publicaciones de un tema utilizando la API de Discourse.
Los resultados devueltos por la API de Discourse en muchas rutas están paginados.
Por ejemplo, el punto de conexión de la API para “Obtener un tema individual” - Ej: https://examplesite/t/{id}.json solo devolverá 20 publicaciones por defecto, incluso si el tema contiene más de 20 publicaciones.
Debido a este comportamiento, hay dos formas de usar la API de Discourse para obtener todas las publicaciones de un tema mediante el punto de conexión .../t/{id}.json.
Agregar un parámetro de consulta
La forma más sencilla de obtener todas las publicaciones de un tema es agregar un parámetro de consulta print=true a la URL a la que estás haciendo la solicitud.
Ej: https://examplesite/t/{id}.json?print=true
Cuando se agrega el parámetro de consulta print=true, Discourse establece el chunk_size para el número de publicaciones devueltas en 1000. Esto significa que este es un buen enfoque mientras estés seguro de que tus temas no tienen más de 1000 publicaciones.
Múltiples solicitudes a la API
El otro método para obtener todas las publicaciones es realizar varias solicitudes a la API para obtener todas las publicaciones del tema:
-
Primero, realiza una solicitud
GETinicial al punto de conexión.../t/{id}.json. Esto contendrá un hashposts_streamque incluye un arraypostsy un arraystream. El arraypostste dará las primeras 20 publicaciones. -
Ahora necesitas recorrer el array
stream, que te proporciona todos los IDs de las publicaciones del tema. Elimina los primeros 20 IDs de las publicaciones del stream (de lo contrario, las volverás a descargar sin necesidad). -
Luego puedes realizar solicitudes adicionales al punto de conexión “Obtener publicaciones específicas de un tema”
.../t/{id}/posts.json, agregarpost_ids[]y pasar todos los IDs del arraystreamen lotes de 20. Ej:.../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
Límites de velocidad
Si encuentras un mensaje Error: you have performed this action many times, please try again later al realizar múltiples llamadas a la API, esto indica que estás alcanzando los límites de velocidad de la clave de la API.
Discourse tiene un límite en el número de solicitudes print=true que se pueden realizar por hora, controlado por la configuración del sitio max prints per hour per user. Esta configuración permite por defecto que los usuarios impriman solo 5 temas por hora. Establecer este valor en 0 deshabilitará completamente la función de impresión (las solicitudes con print=true devolverán un error 403).
Ten en cuenta que el límite de velocidad no se aplicará si el usuario que realiza la solicitud es un administrador. Esto significa que puedes usar una clave de API con el nombre de usuario de un administrador (por ejemplo, system) para el parámetro Api-Username de la solicitud y así omitir el límite de velocidad de impresión.
Si estás encontrando errores de límite de velocidad con solicitudes a la API que no contienen print=true, recomendamos agregar un tiempo de espera a tu script de API para no exceder los límites. Alternativamente, puedes escuchar los códigos de error 429 (demasiadas solicitudes) y reducir la frecuencia de las solicitudes cuando recibas esa respuesta.
Como referencia, los límites de velocidad predeterminados listados a continuación se aplican a nuestros planes de alojamiento estándar y empresarial:
Solo para autoalojados - Consulta: Available settings for global rate limits and throttling para obtener detalles sobre cómo ajustar los límites de velocidad de la API de Discourse.
