EDIT: Ohh you want latest posts, not latest topics. Considering /posts by itself doesn’t have a UI, it probably is missing pagination, I’m sure a PR could be created for this. But to get what you want right now you could still parse the /latest.json endpoint and parse out the topic_id and the post number and fetch the post with /t/<topic_id>/<post_number>, but yea I can see why pagination on the /posts endpoint would be helpful.
Okay, now that I’ve looked at the controller for /posts:
def latest
params.permit(:before)
...
there is a “before” parameter, not a “page” parameter, but using it like a “page” is a bit different because it filters out private posts and such. But I think roughly you can use it like this:
hit /posts.json and get the first post id (currently it is 22000)
subtract 50 (that endpoint only shows at most 50 at a time)
hit /posts.json?before=21950
repeat
Part of the issue which doesn’t make total sense to me is that we are limiting the sql query to 50 results, but then we do more filtering on it after the initial sql query which is why you will not always get 50 results.
as the API designer: it works this way to make things easier on the Discourse server; if the server had to do a bunch of work to always fill up 50 posts anything using the API might start being a perf problem.
Basically it forces the consumers to be “good neighbors”, in a weird sense of the term.
Frage zur Nutzung der API (die ich über das discourse_api-Gem mache, cool!) – sie betrifft die Paginierung (ich würde auch den Endpoint für die neuesten Beiträge nutzen wollen), aber für mein aktuelles Beispiel unten stelle ich etwas aus dem Bereich der Benutzer bereit, da ich zuerst daran gearbeitet habe.
Ich möchte alle Aktivitäten eines Benutzers abrufen (Themen und Antworten reichen), also versuche ich Folgendes:
vsoch = client.user_topics_and_replies("vsoch")
Und dann bekomme ich konsequent eine Liste von 30 Einträgen, unabhängig davon, ob der Benutzer offensichtlich mehr hat. Ich habe versucht, den Quellcode zu bearbeiten, um eine Seitenvariable hinzuzufügen:
# frozen_string_literal: true
module DiscourseApi
module API
module UserActions
def user_replies(username, page=1)
params = { "username": username, "filter": '5', page: page }
response = get("/user_actions.json", params)
response.body["user_actions"]
end
def user_topics_and_replies(username, page=1)
params = { "username": username, "filter": "4,5", page: page }
response = get("/user_actions.json", params)
response.body["user_actions"]
end
end
end
end
aber es scheint nichts zu bewirken – es ist immer dieselbe Liste von 30 Einträgen, unabhängig von der Seitennummer. Ist es möglich, mehr als 30 Einträge zu erhalten? Versuche ich da etwas Falsches? Jede Hilfe wäre sehr willkommen – wenn ich herausfinde, wie man das macht, würde ich sehr gerne einen PR einreichen, damit es auch andere nutzen können