{"meta":{"title":"Verwenden der Paginierung in der REST-API","intro":"Hier erfährst du, wie du über die REST-API durch paginierte Antworten navigierst.","product":"REST-API","breadcrumbs":[{"href":"/de/rest","title":"REST-API"},{"href":"/de/rest/using-the-rest-api","title":"Verwenden der REST-API"},{"href":"/de/rest/using-the-rest-api/using-pagination-in-the-rest-api","title":"Paginierung"}],"documentType":"article"},"body":"# Verwenden der Paginierung in der REST-API\n\nHier erfährst du, wie du über die REST-API durch paginierte Antworten navigierst.\n\n## Informationen zur Paginierung\n\nWenn eine Antwort der REST-API viele Ergebnisse enthält, wird GitHub die Ergebnisse aufteilen, und eine Teilmenge dieser wird zurückgegeben.\n`GET /repos/octocat/Spoon-Knife/issues` gibt beispielsweise nur 30 Issues aus dem Repository `octocat/Spoon-Knife` zurück, obwohl das Repository über 1600 offene Issues enthält. Dadurch werden die Antworten für Server und Benutzer\\*innen leichter zu bewältigen.\n\nDu kannst den `link`-Header aus der Antwort verwenden, um zusätzliche Datenseiten anzufordern. Wenn ein Endpunkt den Abfrageparameter `per_page` unterstützt, kannst du steuern, wie viele Ergebnisse auf einer Seite zurückgegeben werden.\n\nIn diesem Artikel 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.\n\n## Verwenden von `link`-Headern\n\nWenn die Antwort paginiert ist, enthält der Antwortheader einen `link`-Header. Der `link`-Header wird weggelassen, wenn der Endpunkt keine Paginierung unterstützt oder alle Ergebnisse auf eine einzelne Seite passen.\n\nDer `link`-Header enthält URLs, mit denen du zusätzliche Ergebnisseiten abrufen kannst. Beispielsweise die vorherige, nächste, erste und letzte Seite der Ergebnisse.\n\nUm die Antwortheader für einen bestimmten Endpunkt anzuzeigen, können Sie curl, GitHub CLI oder eine Bibliothek verwenden, die Sie zum Senden von Anforderungen verwenden. Um die Antwortheader anzuzeigen, wenn du eine Bibliothek zum Senden von Anforderungen verwendest, befolge die Anweisungen in der Dokumentation für diese Bibliothek. Um die Antwortheader anzuzeigen, wenn Sie curl oder GitHub CLI verwenden, übergeben Sie das Flag `--include` mit Ihrer Anforderung. Zum Beispiel:\n\n```shell\ncurl --include --request GET \\\n--url \"https://api.github.com/repos/octocat/Spoon-Knife/issues\" \\\n--header \"Accept: application/vnd.github+json\"\n```\n\nWenn die Antwort paginiert ist, sieht der `link`-Header ungefähr wie folgt aus:\n\n```http\nlink: <https://api.github.com/repositories/1300192/issues?page=2>; rel=\"prev\", <https://api.github.com/repositories/1300192/issues?page=4>; rel=\"next\", <https://api.github.com/repositories/1300192/issues?page=515>; rel=\"last\", <https://api.github.com/repositories/1300192/issues?page=1>; rel=\"first\"\n```\n\nDer `link`-Header enthält die URL für die vorherige, nächste, erste und letzte Ergebnisseite:\n\n* Die URL für die vorherige Seite wird gefolgt von `rel=\"prev\"`.\n* Die URL für die nächste Seite wird gefolgt von `rel=\"next\"`.\n* Die URL für die letzte Seite wird gefolgt von `rel=\"last\"`.\n* Die URL für die erste Seite wird gefolgt von `rel=\"first\"`.\n\nIn einigen Fällen ist nur eine Teilmenge dieser Links verfügbar. Beispielsweise ist der Link zur vorherigen Seite nicht enthalten, wenn du dich auf der ersten Ergebnisseite befindest, und der Link zur letzten Seite ist nicht enthalten, wenn er nicht berechnet werden kann.\n\nDu kannst die URLs aus dem `link`-Header verwenden, um eine weitere Ergebnisseite anzufordern. So forderst du beispielsweise die letzte Ergebnisseite basierend auf dem vorherigen Beispiel an:\n\n```shell\ncurl --include --request GET \\\n--url \"https://api.github.com/repositories/1300192/issues?page=515\" \\\n--header \"Accept: application/vnd.github+json\"\n```\n\nDie URLs im `link`-Header verwenden Abfrageparameter, um anzugeben, welche Ergebnisseite zurückgegeben werden soll. Die Abfrageparameter in den `link`-URLs können sich je nach Endpunkt unterscheiden: Jeder paginierte Endpunkt verwendet die Abfrageparameter `page`, `before`/`after`, oder `since`. (Einige Endpunkte verwenden den Parameter `since` für andere Zwecke als die Paginierung.) In allen Fällen kannst du die URLs im `link`-Header verwenden, um zusätzliche Ergebnisseiten abzurufen. Weitere Informationen zu Abfrageparametern findest du unter [Erste Schritte mit der REST-API](/de/rest/guides/getting-started-with-the-rest-api#using-query-parameters).\n\n## Ändern der Anzahl der Elemente pro Seite\n\nWenn ein Endpunkt den Abfrageparameter `per_page` unterstützt, kannst du steuern, wie viele Ergebnisse auf einer Seite zurückgegeben werden. Weitere Informationen zu Abfrageparametern findest du unter [Erste Schritte mit der REST-API](/de/rest/guides/getting-started-with-the-rest-api#using-query-parameters).\n\nDiese Anforderung verwendet beispielsweise den Abfrageparameter `per_page`, um zwei Elemente pro Seite zurückzugeben:\n\n```shell\ncurl --include --request GET \\\n--url \"https://api.github.com/repos/octocat/Spoon-Knife/issues?per_page=2\" \\\n--header \"Accept: application/vnd.github+json\"\n```\n\nDer Parameter `per_page` wird automatisch in den `link`-Header eingeschlossen. Zum Beispiel:\n\n```http\nlink: <https://api.github.com/repositories/1300192/issues?per_page=2&page=2>; rel=\"next\", <https://api.github.com/repositories/1300192/issues?per_page=2&page=7715>; rel=\"last\"\n```\n\n## Skriptprogrammierung mit Paginierung\n\nAnstatt URLs manuell aus dem `link`-Header zu kopieren, kannst du ein Skript schreiben, um mehrere Ergebnisseiten abzurufen.\n\nIn den folgenden Beispielen werden JavaScript und die Octokit.js-Bibliothek von GitHub verwendet. Weitere Informationen zu Octokit.js findest du unter [Erste Schritte mit der REST-API](/de/rest/guides/getting-started-with-the-rest-api?tool=javascript) und in der [Infodatei Octokit.js](https://github.com/octokit/octokit.js/#readme).\n\n### Beispiel für die Verwendung der Octokit.js-Paginierungsmethode\n\nDu kannst `octokit.paginate()` verwenden, um mit Octokit.js paginierte Ergebnisse abzurufen.\n`octokit.paginate()` ruft die nächste Ergebnisseite ab, bis die letzte Seite erreicht ist, und gibt dann alle Ergebnisse als einzelnes Array zurück. Einige Endpunkte geben paginierte Ergebnisse als Array in einem Objekt zurück, anstatt die paginierten Ergebnisse als Array zurückzugeben.\n`octokit.paginate()` gibt immer ein Array aus Elementen zurück, auch wenn das Rohergebnis ein Objekt war.\n\nDieses Skript ruft beispielsweise alle Issues aus dem Repository `octocat/Spoon-Knife` ab. Obwohl 100 Issues gleichzeitig angefordert werden, wird die Funktion erst zurückgegeben, wenn die letzte Datenseite erreicht ist.\n\n```javascript copy\nimport { Octokit } from \"octokit\";\n\nconst octokit = new Octokit({ );\n\nconst data = await octokit.paginate(\"GET /repos/{owner}/{repo}/issues\", {\n  owner: \"octocat\",\n  repo: \"Spoon-Knife\",\n  per_page: 100,\n  headers: {\n    \"X-GitHub-Api-Version\": \"2026-03-10\",\n  },\n});\n\nconsole.log(data)\n```\n\nDu kannst eine optionale Zuordnungsfunktion an `octokit.paginate()` übergeben, um die Paginierung zu beenden, bevor die letzte Seite erreicht wird, oder um die Arbeitsspeicherauslastung zu reduzieren, indem nur eine Teilmenge der Antwort beibehalten wird. Du kannst auch `octokit.paginate.iterator()` verwenden, um immer nur eine Seite gleichzeitig zu durchlaufen, anstatt jede Seite anzufordern. Weitere Informationen findest du in der [Octokit.js-Dokumentation](https://github.com/octokit/octokit.js#pagination).\n\n### Beispiel zum Erstellen einer Paginierungsmethode\n\nWenn du eine andere Sprache oder Bibliothek ohne Paginierungsmethode verwendest, kannst du eine eigene Paginierungsmethode erstellen. In diesem Beispiel wird weiterhin die Octokit.js-Bibliothek verwendet, um Anforderungen zu stellen, doch es besteht keine Abhängigkeit von `octokit.paginate()`.\n\nDie `getPaginatedData`-Funktion sendet mit `octokit.request()` eine Anforderung an einen Endpunkt. Die Daten aus der Antwort werden von `parseData` verarbeitet. Mit dieser Funktion werden Fälle verarbeitet, in denen keine Daten zurückgegeben werden oder die zurückgegebenen Daten ein Objekt anstelle eines Arrays sind. Die verarbeiteten Daten werden dann an eine Liste angefügt, die alle bisher gesammelten paginierten Daten enthält. Wenn die Antwort einen `link`-Header enthält und der `link`-Header einen Link für die nächste Seite enthält, verwendet die Funktion ein RegEx-Muster (`nextPattern`), um die URL für die nächste Seite abzurufen. Die Funktion wiederholt dann die vorherigen Schritte und verwendet nun diese neue URL. Sobald der `link`-Header keinen Link zur nächsten Seite mehr enthält, werden alle Ergebnisse zurückgegeben.\n\n```javascript copy\nimport { Octokit } from \"octokit\";\n\nconst octokit = new Octokit({ );\n\nasync function getPaginatedData(url) {\n  const nextPattern = /(?<=<)([\\S]*)(?=>; rel=\"next\")/i;\n  let pagesRemaining = true;\n  let data = [];\n\n  while (pagesRemaining) {\n    const response = await octokit.request(`GET ${url}`, {\n      per_page: 100,\n      headers: {\n        \"X-GitHub-Api-Version\":\n          \"2026-03-10\",\n      },\n    });\n\n    const parsedData = parseData(response.data)\n    data = [...data, ...parsedData];\n\n    const linkHeader = response.headers.link;\n\n    pagesRemaining = linkHeader && linkHeader.includes(`rel=\\\"next\\\"`);\n\n    if (pagesRemaining) {\n      url = linkHeader.match(nextPattern)[0];\n    }\n  }\n\n  return data;\n}\n\nfunction parseData(data) {\n  // If the data is an array, return that\n    if (Array.isArray(data)) {\n      return data\n    }\n\n  // Some endpoints respond with 204 No Content instead of empty array\n  //   when there is no data. In that case, return an empty array.\n  if (!data) {\n    return []\n  }\n\n  // Otherwise, the array of items that we want is in an object\n  // Delete keys that don't include the array of items\n  delete data.incomplete_results;\n  delete data.repository_selection;\n  delete data.total_count;\n  // Pull out the array of items\n  const namespaceKey = Object.keys(data)[0];\n  data = data[namespaceKey];\n\n  return data;\n}\n\nconst data = await getPaginatedData(\"/repos/octocat/Spoon-Knife/issues\");\n\nconsole.log(data);\n```"}