Dies ist eine Anleitung, die erklärt, wie man alle Beiträge eines Themas über die Discourse-API abruft.
Die von der Discourse-API für viele Routen zurückgegebenen Ergebnisse sind paginiert.
Beispielsweise gibt der API-Endpunkt für „Ein einzelnes Thema abrufen" – z. B. https://examplesite/t/{id}.json – standardmäßig nur 20 Beiträge zurück, selbst wenn das Thema mehr als 20 Beiträge enthält.
Aufgrund dieses Verhaltens gibt es zwei Möglichkeiten, wie Sie die Discourse-API nutzen können, um alle Beiträge eines Themas über den Endpunkt .../t/{id}.json abzurufen.
Einen Abfrageparameter anhängen
Der einfachste Weg, alle Beiträge eines Themas abzurufen, besteht darin, einen Abfrageparameter print=true an die URL anzuhängen, an die Sie die Anfrage senden.
Beispiel: https://examplesite/t/{id}.json?print=true
Wenn der Abfrageparameter print=true hinzugefügt wird, setzt Discourse die chunk_size für die Anzahl der zurückgegebenen Beiträge auf 1000. Das bedeutet, dass dies ein guter Ansatz ist, solange Sie sicher sind, dass Ihre Themen nicht mehr als 1000 Beiträge enthalten.
Mehrere API-Anfragen
Die andere Methode zum Abrufen aller Beiträge besteht darin, mehrere API-Anfragen zu stellen, um alle Beiträge des Themas zu erhalten:
-
Zuerst stellen Sie eine initiale
GET-Anfrage an den Endpunkt.../t/{id}.json. Dieser enthält einenposts_stream-Hash, der einposts-Array und einstream-Array enthält. Dasposts-Array liefert Ihnen die ersten 20 Beiträge. -
Jetzt müssen Sie durch das
stream-Array iterieren, das Ihnen alle Beitrags-IDs im Thema liefert. Entfernen Sie die ersten 20 Beitrags-IDs aus dem Stream (sonst laden Sie sie unnötigerweise erneut herunter). -
Anschließend können Sie weitere Anfragen an den Endpunkt „Spezifische Beiträge aus einem Thema abrufen"
.../t/{id}/posts.jsonstellen,post_ids[]anhängen und alle IDs aus demstream-Array in Blöcken von 20 übergeben. Beispiel:\n.../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
Ratenlimits
Wenn Sie bei mehreren API-Aufrufen die Fehlermeldung Error: you have performed this action many times, please try again later erhalten, bedeutet dies, dass Sie auf Ratenlimits für Ihren API-Schlüssel stoßen.
Discourse hat ein Limit für die Anzahl der print=true-Anfragen pro Stunde, das durch die Site-Einstellung max prints per hour per user gesteuert wird. Diese Einstellung erlaubt standardmäßig nur, dass Benutzer 5 Themen pro Stunde drucken. Wenn Sie diesen Wert auf 0 setzen, wird das Drucken vollständig deaktiviert (Anfragen mit print=true führen zu einem 403-Fehler).
Beachten Sie, dass das Ratenlimit nicht angewendet wird, wenn der anfragende Benutzer ein Administrator ist. Das bedeutet, dass Sie einen API-Schlüssel mit dem Benutzernamen eines Administrators (z. B. system) für den Parameter Api-Username der Anfrage verwenden können, um das Druck-Ratenlimit zu umgehen.
Wenn Sie bei API-Anfragen, die kein print=true enthalten, auf Ratenlimit-Fehler stoßen, empfehlen wir, ein Timeout zu Ihrem API-Skript hinzuzufügen, damit Sie die Ratenlimits nicht überschreiten. Alternativ können Sie auf Fehlercodes 429 (zu viele Anfragen) lauschen und die Anfragen verzögern, wenn Sie diese Antwort erhalten.
Zur Referenz gelten die unten aufgeführten Standard-Ratenlimits für unsere Standard- und Business-Hosting-Pläne:
Nur für Self-Hosting – Weitere Informationen zur Anpassung der Discourse-API-Ratenlimits finden Sie unter: Available settings for global rate limits and throttling
