Skip to main content

Utilisation de la pagination dans l’API GraphQL

DĂ©couvrez comment parcourir les jeux de donnĂ©es Ă  l’aide de la pagination basĂ©e sur le curseur avec l’API GraphQL.

À propos de la pagination

L'API GraphQL de GitHub limite le nombre d'Ă©lĂ©ments que vous pouvez rĂ©cupĂ©rer en une seule requĂȘte afin de protĂ©ger les serveurs de GitHub contre les requĂȘtes excessives ou abusives. Lorsque vous utilisez l’API GraphQL, vous devez fournir un argument firstou last sur n’importe quelle connexion. La valeur de ces arguments doit ĂȘtre comprise entre 1 et 100. L’API GraphQL retourne le nombre de connexions spĂ©cifiĂ©es par l’argument first ou last.

Si les donnĂ©es auxquelles vous accĂ©dez ont plus de connexions que le nombre d’élĂ©ments spĂ©cifiĂ©s par l’argument first ou last., la rĂ©ponse est divisĂ©e en « pages » plus petites de la taille spĂ©cifiĂ©e. Ces pages peuvent ĂȘtre extraites une Ă  la fois jusqu’à ce que l’ensemble du jeu de donnĂ©es ait Ă©tĂ© rĂ©cupĂ©rĂ©. Chaque page contient le nombre d’élĂ©ments spĂ©cifiĂ©s par l’argument first ou last., sauf s’il s’agit de la derniĂšre page, qui peut contenir un nombre infĂ©rieur d’élĂ©ments.

Ce guide montre comment demander des pages de résultats supplémentaires pour les réponses paginées, comment changer le nombre de résultats retournés sur chaque page et comment écrire un script pour récupérer plusieurs pages de résultats.

Demande d’une cursor dans votre requĂȘte

Lorsque vous utilisez l’API GraphQL, vous utilisez des curseurs pour parcourir un jeu de donnĂ©es paginĂ©. Le curseur reprĂ©sente une position spĂ©cifique dans le jeu de donnĂ©es. Vous pouvez obtenir le premier et le dernier curseur d’une page en interrogeant l’objet pageInfo. Par exemple :

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

Dans cet exemple, pageInfo.startCursor donne le curseur pour le premier Ă©lĂ©ment de la page. pageInfo.endCursor donne le curseur pour le dernier Ă©lĂ©ment de la page. pageInfo.hasNextPage et pageInfo.hasPreviousPage indiquent s’il existe une page avant et aprĂšs la page retournĂ©e.

Changement du nombre d’élĂ©ments par page

Les arguments first ou last. contrĂŽlent le nombre d’élĂ©ments retournĂ©s. Le nombre maximal d’élĂ©ments que vous pouvez extraire Ă  l’aide de l’argument first ou last est de 100. Vous devrez peut-ĂȘtre demander moins de 100 Ă©lĂ©ments si votre requĂȘte touche un grand nombre de donnĂ©es afin d’éviter d’atteindre une limite de dĂ©bit ou de Nodes. Pour plus d’informations, consultez « Rate limits and query limits for the GraphQL API Â».

Parcourir le jeu de donnĂ©es Ă  l’aide de la pagination

Une fois que vous avez retournĂ© un curseur Ă  partir d’une requĂȘte, vous pouvez utiliser le curseur pour demander la page suivante des rĂ©sultats. Pour ce faire, vous allez utiliser l’argument after ou before et le curseur.

Par exemple, en supposant que la pageInfo.endCursor valeur de l’exemple prĂ©cĂ©dent Ă©tait Y3Vyc29yOnYyOpHOUH8B7g==, vous pouvez utiliser cette requĂȘte pour demander la page suivante des rĂ©sultats :

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

Vous pouvez continuer Ă  envoyer des requĂȘtes avec la nouvelle valeur pageInfo.endCursor retournĂ©e dans la rĂ©ponse jusqu’à ce qu’il ne reste aucune page Ă  parcourir, indiquĂ©e en pageInfo.hasNextPage retournant false.

Si vous avez spĂ©cifiĂ© l’argument last au lieu de l’argument first, la derniĂšre page de rĂ©sultats est retournĂ©e en premier. Dans ce cas, vous allez utiliser la valeur pageInfo.startCursor et l’argument before pour obtenir la page prĂ©cĂ©dente des rĂ©sultats. Une fois pageInfo.hasPreviousPage retournĂ© false, vous avez atteint la derniĂšre page. Par exemple :

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

Étapes suivantes

Vous pouvez utiliser le SDK Octokit de GitHub et le plugin octokit/plugin-paginate-graphql pour prendre en charge la pagination dans vos scripts. Pour plus d’informations, consultez plugin-paginate-graphql.js.