# Использование разбиения на страницы в API GraphQL

Узнайте, как просматривать наборы данных с помощью разбиения на страницы на основе курсоров с помощью API GraphQL.

## Сведения о разбиении на страницы

GraphQL API GitHub ограничивает количество элементов, которые можно получить в одном запросе, чтобы защитить от чрезмерных или злоупотребленных запросов к серверам GitHub. При использовании API GraphQL необходимо указать `first` или `last` аргумент для любого подключения. Значение этих аргументов должно быть от 1 до 100. API GraphQL возвращает количество подключений, указанных аргументом или `first` аргументом`last`.

Если доступ к данным имеет больше подключений, чем количество элементов, указанных `first` аргументом, `last` ответ делится на меньшие "страницы" указанного размера. Эти страницы можно получить по одному за раз до получения всего набора данных. Каждая страница содержит количество элементов, указанных аргументом `first` или `last` аргументом, если это не последняя страница, которая может содержать меньшее число элементов.

В этом руководстве показано, как запрашивать дополнительные страницы результатов для ответов с разбивкой на страницы, как изменить количество результатов, возвращаемых на каждой странице, и как написать скрипт для получения нескольких страниц результатов.

## Запрос в запросе `cursor`

При использовании API GraphQL можно использовать курсоры для обхода по набору данных с разбивкой на страницы. Курсор представляет определенную позицию в наборе данных. Вы можете получить первый и последний курсор на странице, запрашивая `pageInfo` объект. Например:

```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
      }
    }
  }
}
```

В этом примере `pageInfo.startCursor` курсор для первого элемента на странице.
`pageInfo.endCursor` возвращает курсор для последнего элемента на странице.
`pageInfo.hasNextPage` и `pageInfo.hasPreviousPage` укажите, есть ли страница до и после возвращаемой страницы.

## Изменение количества элементов на странице

`first` Аргументы `last` определяют количество возвращаемых элементов. Максимальное количество элементов, которые можно получить с помощью `first` аргумента или `last` аргумента, равно 100. Возможно, вам потребуется запросить менее 100 элементов, если запрос касается большого количества данных, чтобы избежать достижения ограничения скорости или узла. Дополнительные сведения см. в разделе [Ограничения скорости и ограничения запросов для API GraphQL](/ru/enterprise-server@3.22/graphql/overview/rate-limits-and-query-limits-for-the-graphql-api).

## Обход набора данных с помощью разбиения на страницы

После возврата курсора из запроса можно использовать курсор для запроса следующей страницы результатов. To do вы будете использовать аргумент `after` или `before` и курсор.

Например, при условии `pageInfo.endCursor` , что значение из предыдущего примера было `Y3Vyc29yOnYyOpHOUH8B7g==`, этот запрос можно использовать для запроса следующей страницы результатов:

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

Вы можете продолжать отправлять запросы с новым `pageInfo.endCursor` значением, возвращаемым в ответе, пока не осталось страниц для обхода, указанных `pageInfo.hasNextPage`путем `false` возврата.

Если вы указали `last` вместо `first` аргумента, то сначала будет возвращена последняя страница результатов. В этом случае вы будете использовать `pageInfo.startCursor` значение и `before` аргумент для получения предыдущей страницы результатов. После `pageInfo.hasPreviousPage` возврата `false`вы достигли последней страницы. Например:

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

## Следующие шаги

Вы можете использовать пакет SDK Octokit для GitHubи подключаемый `octokit/plugin-paginate-graphql` модуль для поддержки разбиения на страницы в скриптах. Для получения дополнительной информации см. [plugin-paginate-graphql.js](https://github.com/octokit/plugin-paginate-graphql.js).