Dies ist eine Anleitung, die erklärt, wie man alle Beiträge aus einem Thema über die Discourse-API abruft.
Die von der Discourse-API für viele Routen zurückgegebenen Ergebnisse sind paginiert.
Zum Beispiel 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, auch wenn das Thema mehr als 20 Beiträge enthält.
Aufgrund dieses Verhaltens gibt es zwei Möglichkeiten, die Discourse-API zu verwenden, um alle Beiträge für ein Thema über den Endpunkt .../t/{id}.json abzurufen.
Query-Parameter anhängen
Der einfachste Weg, alle Beiträge aus einem Thema abzurufen, ist das Hinzufügen eines print=true-Query-Parameters zur URL, an die Sie die Anfrage senden.
Z. B.: https://examplesite/t/{id}.json?print=true
Wenn der print=true-Query-Parameter 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 aus dem Thema zu erhalten:
-
Zuerst würden Sie eine anfängliche
GET-Anfrage an den Endpunkt.../t/{id}.jsonstellen. Diese 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 schleifen, das Ihnen alle Beitrags-IDs im Thema liefert. Entfernen Sie die ersten 20 Beitrags-IDs aus dem Stream (andernfalls laden Sie sie ohne Grund erneut herunter). -
Sie können dann zusätzliche Anfragen an den Endpunkt “Bestimmte 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. Z. B.
.../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
Ratenbegrenzungen
Wenn Sie beim Stellen mehrerer API-Aufrufe die Meldung “Error: you have performed this action many times, please try again later” erhalten, deutet dies darauf hin, dass Sie die Ratenbegrenzungen für API-Schlüssel erreichen.
Discourse hat ein Limit für die Anzahl der print=true-Anfragen, die pro Stunde gestellt werden können, was durch die Website-Einstellung max prints per hour per user gesteuert wird. Diese Einstellung erlaubt standardmäßig nur 5 Themen pro Stunde. Sie können diese Einstellung auf 0 setzen, um die Ratenbegrenzung zu deaktivieren.
Beachten Sie, dass die Ratenbegrenzung nicht angewendet wird, wenn Sie einen All Users API-Schlüssel für die Anfragen verwenden und den Benutzernamen eines Website-Administrators für den Parameter Api-Username der Anfrage angeben. Das bedeutet, dass Sie anstatt die Website-Einstellung max prints per hour per user zu deaktivieren, einfach einen Admin-Benutzernamen (z. B. system) für die Anfragen verwenden könnten.
Wenn Sie Ratenbegrenzungsfehler bei API-Anfragen feststellen, die nicht print=true enthalten, empfehlen wir, Ihrem API-Skript ein Timeout hinzuzufügen, damit Sie die Ratenbegrenzungen nicht überschreiten. Alternativ können Sie auf 429 (zu viele Anfragen) Fehlercodes lauschen und die Anfragen zurückstellen, wenn Sie diese Antwort erhalten.
Als Referenz gelten die unten aufgeführten Standard-Ratenbegrenzungen für unsere Standard- und Business-Hosting-Pläne:
Nur für selbst gehostete Installationen - Siehe: Available settings for global rate limits and throttling für Details zur Anpassung der Discourse-API-Ratenbegrenzungen.
