Option A: Paginierung des Schlüsselsatzes mit einem Zeitstempel
Um die von Ihnen erwähnten Nachteile der Offset-Paginierung zu vermeiden, können Sie die keyset-basierte Paginierung verwenden. Normalerweise haben die Entitäten einen Zeitstempel, der ihre Erstellungs- oder Änderungszeit angibt. Dieser Zeitstempel kann für die Paginierung verwendet werden: Übergeben Sie einfach den Zeitstempel des letzten Elements als Abfrageparameter für die nächste Anfrage. Der Server wiederum verwendet den Zeitstempel als Filterkriterium (z.B. WHERE modificationDate >= receivedTimestampParameter
)
{
"elements": [
{"data": "data", "modificationDate": 1512757070}
{"data": "data", "modificationDate": 1512757071}
{"data": "data", "modificationDate": 1512757072}
],
"pagination": {
"lastModificationDate": 1512757072,
"nextPage": "https://domain.de/api/elements?modifiedSince=1512757072"
}
}
Auf diese Weise verpassen Sie kein einziges Element. Dieser Ansatz sollte für viele Anwendungsfälle ausreichend sein. Beachten Sie jedoch Folgendes:
- Es kann zu Endlosschleifen kommen, wenn alle Elemente einer einzelnen Seite denselben Zeitstempel haben.
- Es kann vorkommen, dass Sie viele Elemente mehrfach an den Kunden liefern, wenn sich Elemente mit demselben Zeitstempel auf zwei Seiten überschneiden.
Sie können diese Nachteile weniger wahrscheinlich machen, indem Sie die Seitengröße erhöhen und Zeitstempel mit Millisekundengenauigkeit verwenden.
Option B: Erweiterte Keyset-Paginierung mit einem Fortsetzungs-Token
Um die genannten Nachteile der normalen Paginierung von Keysets zu umgehen, können Sie dem Zeitstempel einen Offset hinzufügen und ein so genanntes "Continuation Token" oder "Cursor" verwenden. Der Offset ist die Position des Elements relativ zum ersten Element mit demselben Zeitstempel. Normalerweise hat das Token ein Format wie Timestamp_Offset
. Sie wird in der Antwort an den Client weitergegeben und kann an den Server zurückgeschickt werden, um die nächste Seite abzurufen.
{
"elements": [
{"data": "data", "modificationDate": 1512757070}
{"data": "data", "modificationDate": 1512757072}
{"data": "data", "modificationDate": 1512757072}
],
"pagination": {
"continuationToken": "1512757072_2",
"nextPage": "https://domain.de/api/elements?continuationToken=1512757072_2"
}
}
Das Token "1512757072_2" verweist auf das letzte Element der Seite und besagt: "Der Client hat bereits das zweite Element mit dem Zeitstempel 1512757072 erhalten". Auf diese Weise weiß der Server, wo er fortfahren soll.
Bitte beachten Sie, dass Sie Fälle behandeln müssen, in denen die Elemente zwischen zwei Anfragen geändert wurden. Dies geschieht in der Regel durch Hinzufügen einer Prüfsumme zum Token. Diese Prüfsumme wird über die IDs aller Elemente mit diesem Zeitstempel berechnet. Das Ergebnis ist ein Token-Format wie dieses: Timestamp_Offset_Checksum
.
Weitere Informationen zu diesem Ansatz finden Sie in dem Blogbeitrag " Web-API-Paginierung mit Fortsetzungs-Tokens ". Ein Nachteil dieses Ansatzes ist die schwierige Implementierung, da es viele Eckfälle gibt, die berücksichtigt werden müssen. Aus diesem Grund sind Bibliotheken wie Fortsetzungs-Token kann nützlich sein (wenn Sie Java oder eine JVM-Sprache verwenden). Haftungsausschluss: Ich bin der Autor des Beitrags und ein Co-Autor der Bibliothek.