Сведения о разбиении на страницы
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.