# Uso de la paginación en la API GraphQL

Aprenda a recorrer conjuntos de datos mediante la paginación basada en cursores con GraphQL API.

## Acerca de la paginación

La GraphQL API de GitHub limita el número de elementos que se pueden capturar en una sola solicitud para protegerse frente a solicitudes excesivas o abusivas a los servidores de GitHub. Al usar GraphQL API, debe proporcionar un argumento `first` o `last` en cualquier conexión. El valor de estos argumentos debe estar entre 1 y 100. GraphQL API devolverá el número de conexiones especificadas por el argumento `first` o `last`.

Si los datos a los que tiene acceso tienen más conexiones que el número de elementos especificados por el argumento `first` o `last`, la respuesta se divide en "páginas" más pequeñas del tamaño especificado. Estas páginas se pueden capturar de una en una hasta que se haya recuperado todo el conjunto de datos. Cada página contiene el número de elementos especificados por el argumento `first` o `last`, a menos que sea la última página, que puede contener un número inferior de elementos.

En esta guía se describe cómo solicitar más páginas de resultados de respuestas paginadas, cómo cambiar el número de resultados devueltos en cada página y cómo escribir un script para capturar varias páginas de resultados.

## Solicitud de un `cursor` en la consulta

Al usar GraphQL API, se usan cursores para recorrer un conjunto de datos paginado. El cursor representa una posición específica en el conjunto de datos. Puede obtener el primer y último cursor de una página consultando el objeto `pageInfo`. Por ejemplo:

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

En este ejemplo, `pageInfo.startCursor` proporciona el cursor para el primer elemento de la página.
`pageInfo.endCursor` proporciona el cursor para el último elemento de la página.
`pageInfo.hasNextPage` e `pageInfo.hasPreviousPage` indican si hay una página antes y después de la página que se devolvió.

## Modificación del número de elementos por página

Los argumentos `first` y `last` controlan cuántos elementos se devuelven. El número máximo de elementos que puede capturar mediante el argumento `first` o `last` es 100. Es posible que tenga que solicitar menos de 100 elementos si la consulta toca una gran cantidad de datos para evitar alcanzar un límite de velocidad o un límite de nodos. Para más información, consulta [Límites de frecuencia y consulta para GraphQL API](/es/enterprise-server@3.22/graphql/overview/rate-limits-and-query-limits-for-the-graphql-api).

## Recorrer un conjunto de datos utilizando paginación

Una vez que devuelva un cursor de una consulta, puede usar el cursor para solicitar la siguiente página de resultados. Para hacerlo, usará el argumento `after` o `before` y el cursor.

Por ejemplo, suponiendo que el valor `pageInfo.endCursor` del ejemplo anterior era `Y3Vyc29yOnYyOpHOUH8B7g==`, puede usar esta consulta para solicitar la siguiente página de resultados:

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

Puede seguir enviando consultas con el nuevo valor `pageInfo.endCursor` devuelto en la respuesta hasta que no quedan páginas por recorrer, indicado por `pageInfo.hasNextPage` devolviendo `false`.

Si especificó `last` en lugar del argumento `first`, primero se devolverá la última página de resultados. En este caso, usará el valor `pageInfo.startCursor` y el argumento `before` para obtener la página anterior de resultados. Una vez que `pageInfo.hasPreviousPage` devuelve `false`, ha llegado a la última página. Por ejemplo:

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

## Pasos siguientes

Puede usar el SDK de Octokit de GitHub y el complemento `octokit/plugin-paginate-graphql` para soportar la paginación en los scripts. Para obtener más información, vea [plugin-paginate-graphql.js](https://github.com/octokit/plugin-paginate-graphql.js).