Questa è una guida pratica su come recuperare tutti i post di un argomento utilizzando l’API di Discourse
I risultati restituiti dall’API di Discourse per molte rotte sono paginati.
Ad esempio, l’endpoint API per “Ottieni un singolo argomento” - Esempio: https://examplesite/t/{id}.json restituirà solo 20 post per impostazione predefinita, anche se l’argomento contiene più di 20 post.
A causa di questo comportamento, ci sono due modi per utilizzare l’API di Discourse per recuperare tutti i post di un argomento utilizzando l’endpoint .../t/{id}.json.
Aggiungi un parametro di query
Il modo più semplice per recuperare tutti i post di un argomento è aggiungere un parametro di query print=true all’URL a cui stai effettuando la richiesta.
Esempio: https://examplesite/t/{id}.json?print=true
Quando viene aggiunto il parametro di query print=true, Discourse imposta la chunk_size per il numero di post restituiti a 1000. Ciò significa che questo è un buon approccio da utilizzare purché si sia certi che i propri argomenti non abbiano più di 1000 post.
Più richieste API
L’altro metodo per recuperare tutti i post è effettuare più richieste API per ottenere tutti i post dell’argomento:
-
Innanzitutto, effettua una richiesta
GETiniziale all’endpoint.../t/{id}.json. Questa conterrà un hashposts_streamche include un arraypostse un arraystream. L’arraypoststi fornirà i primi 20 post. -
Ora devi iterare sull’array
stream, che ti fornisce tutti gli ID dei post nell’argomento. Rimuovi i primi 20 ID dei post dallo stream (altrimenti li scaricheresti di nuovo senza motivo). -
Puoi quindi effettuare richieste aggiuntive all’endpoint “Ottieni post specifici da un argomento”
.../t/{id}/posts.json, aggiungerepost_ids[]e passare tutti gli ID dall’arraystreamin blocchi di 20. Esempio:
.../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
Limiti di velocità
Se ricevi un messaggio di errore Error: you have performed this action many times, please try again later durante l’esecuzione di più chiamate API, ciò indica che hai raggiunto i limiti di velocità della chiave API.
Discourse ha un limite sul numero di richieste print=true che possono essere effettuate per ora, controllato dall’impostazione del sito max prints per hour per user. Questa impostazione consente per impostazione predefinita agli utenti di stampare solo 5 argomenti all’ora. Impostarla su 0 disabiliterà completamente la stampa (le richieste con print=true restituiranno un errore 403).
Tieni presente che il limite di velocità non verrà applicato se l’utente che effettua la richiesta è un amministratore. Ciò significa che puoi utilizzare una chiave API con il nome utente di un amministratore (ad esempio system) per il parametro Api-Username della richiesta per aggirare il limite di velocità della stampa.
Se incontri errori di limite di velocità con richieste API che non contengono print=true, consigliamo di aggiungere un timeout allo script API in modo da non superare i limiti di velocità. In alternativa, puoi ascoltare i codici di errore 429 (troppe richieste) e ridurre la frequenza delle richieste quando ricevi tale risposta.
Per riferimento, i limiti di velocità predefiniti elencati di seguito si applicano ai nostri piani di hosting standard e business:
Solo per installazioni self-hosted - Consulta: Available settings for global rate limits and throttling per i dettagli sulla regolazione dei limiti di velocità dell’API di Discourse.
