Skip to main content

Verwenden der Paginierung in der GraphQL-API

Erfahren Sie, wie Sie Datensätze mithilfe der cursorbasierten Paginierung mit der GraphQL-API durchlaufen.

Informationen zur Paginierung

Die GraphQL-API von GitHub beschränkt die Anzahl der Elemente, die Sie in einer einzigen Anforderung abrufen können, um vor übermäßigen oder missbräuchlichen Anforderungen an GitHub-Server zu schützen. Wenn Sie die GraphQL-API verwenden, müssen Sie für jede Verbindung ein first- oder ein last-Argument angeben. Der Wert dieser Argumente muss zwischen 1 und 100 liegen. Die GraphQL-API gibt die Anzahl der Verbindungen zurück, die durch das first- oder das last-Argument angegeben wurden.

Wenn die Daten, auf die Sie zugreifen, über mehr Verbindungen als die Anzahl der durch das first- oder last-Argument angegebenen Elemente verfügen, wird die Antwort in kleinere „Seiten“ der angegebenen Größe unterteilt. Diese Seiten können jeweils einzeln abgerufen werden, bis der gesamte Datensatz abgerufen wurde. Jede Seite enthält die Anzahl der durch das first- oder last-Argument angegebenen Elemente, es sei denn, sie ist die letzte Seite, die eine niedrigere Anzahl von Elementen enthalten kann.

In diesem Leitfaden wird veranschaulicht, wie du zusätzliche Ergebnisseiten für paginierte Antworten anforderst, die Anzahl der auf jeder Seite zurückgegebenen Ergebnisse änderst und ein Skript schreibst, um mehrere Ergebnisseiten abzurufen.

Anfordern einer cursor in Ihrer Abfrage

Bei Verwendung der GraphQL-API verwenden Sie Cursor, um ein paginiertes Dataset zu durchlaufen. Der Cursor stellt eine bestimmte Position im Dataset dar. Sie können den ersten und letzten Cursor auf einer Seite abrufen, indem Sie das pageInfo-Objekt abfragen. Zum Beispiel:

query($owner: String!, $name: String!) {
  repository(owner: $owner, name: $name) {
    pullRequests(first: 100, after: null) {
      nodes {
        createdAt
        number
        title
      }
      pageInfo {
        endCursor
        startCursor
        hasNextPage
        hasPreviousPage
      }
    }
  }
}

In diesem Beispiel gibt pageInfo.startCursor den Cursor für das erste Element auf der Seite an. pageInfo.endCursor gibt den Cursor für das letzte Element auf der Seite an. pageInfo.hasNextPage und pageInfo.hasPreviousPage geben an, ob vor und nach der zurückgegebenen Seite eine Seite vorhanden ist.

Ändern der Anzahl der Elemente pro Seite

Die Argumente first und last steuern, wie viele Elemente zurückgegeben werden. Die maximale Anzahl von Elementen, die Sie mit dem Argument first oder last abrufen können, beträgt 100. Möglicherweise müssen Sie weniger als 100 Elemente anfordern, wenn Ihre Abfrage viele Daten berührt, um zu vermeiden, dass ein Raten- oder Knotenlimit erreicht wird. Weitere Informationen finden Sie unter Ratenbegrenzungen und Knotengrenzwerte für die GraphQL-API.

Durchlaufen des Datasets mithilfe der Paginierung

Nachdem Sie einen Cursor aus einer Abfrage zurückgegeben haben, können Sie den Cursor verwenden, um die nächste Ergebnisseite anzufordern. Dazu verwenden Sie das Argument after oder before und den Cursor.

Angenommen, der pageInfo.endCursor-Wert aus dem vorherigen Beispiel lautete Y3Vyc29yOnYyOpHOUH8B7g==. Sie können nun diese Abfrage verwenden, um die nächste Ergebnisseite anzufordern:

query($owner: String!, $name: String!) {
  repository(owner: $owner, name: $name) {
    pullRequests(first: 1, after: "Y3Vyc29yOnYyOpHOUH8B7g==") {
      nodes {
        createdAt
        number
        title
      }
      pageInfo {
        endCursor
        hasNextPage
        hasPreviousPage
      }
    }
  }
}

Sie können weiterhin Abfragen mit dem neuen pageInfo.endCursor-Wert senden, der in der Antwort zurückgegeben wird, bis keine zu durchlaufenden Seiten mehr vorhanden sind, die durch pageInfo.hasNextPage angegeben sind und false zurückgeben.

Wenn Sie das last-Argument anstelle des first-Arguments angegeben haben, wird die letzte Seite der Ergebnisse zuerst zurückgegeben. In diesem Fall verwenden Sie den pageInfo.startCursor-Wert und das before-Argument, um die vorherige Ergebnisseite abzurufen. Sobald pageInfo.hasPreviousPage false zurückgibt, haben Sie die letzte Seite erreicht. Zum Beispiel:

query($owner: String!, $name: String!) {
  repository(owner: $owner, name: $name) {
    pullRequests(last: 1, before: "R3Vyc29yOnYyOpHOHcfoOg==") {
      nodes {
        createdAt
        number
        title
      }
      pageInfo {
        startCursor
        hasPreviousPage
      }
    }
  }
}

Nächste Schritte

Sie können das Octokit-SDK von GitHub und das octokit/plugin-paginate-graphql-Plug-In verwenden, um die Paginierung in Ihren Skripts zu unterstützen. Weitere Informationen findest du unter plugin-paginate-graphql.js.