Skip to main content

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

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

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

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

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

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

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

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

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 укажите, есть ли страница до и после возвращаемой страницы.

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

last Аргументы first определяют количество возвращаемых элементов. Максимальное количество элементов, которые можно получить с помощью first аргумента или last аргумента, равно 100. Возможно, вам потребуется запросить менее 100 элементов, если запрос касается большого количества данных, чтобы избежать достижения ограничения скорости или узла. Дополнительные сведения см. в разделе Ограничения скорости и ограничения узлов для API GraphQL.

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

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

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

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 значением, возвращаемым в ответе, пока не осталось страниц для обхода, указанных falseпутем pageInfo.hasNextPage возврата.

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

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.