Skip to main content

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

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

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

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

При использовании 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 для и подключаемый octokit/plugin-paginate-graphql модуль для поддержки разбиения на страницы в скриптах. Дополнительные сведения см. в plugin-paginate-graphql.js.