Пагинация
Для пагинации результатов запросы должны отправляться через поле пути edges.
При получении больших объёмов данных может стать проблемой их отображение в удобном для пользователя виде. GraphQL API предоставляет гибкие возможности постраничного вывода данных, для чего используется целый ряд полей и аргументов.
Курсор
Для удобства определения объектов в возвращаемом ответе каждому объекту присваивется собственный идентификатор, именуемый курсором. Чтобы получить этот идентификатор, в тело операции нужно добавить поле cursor:
{
instruments {
edges {
cursor
node {
basicInformation {
...
}
}
}
}
}
В ответ система вернёт для cursor идентификатор выбранного объекта в базе данных системы:
{
"data": {
"instruments": {
"edges": [
{
"cursor": "MA==",
"node": {
"basicInformation": {
...
}
}
},
]
}
}
}
Курсор как отправная точка
Полученный курсор можно использовать как отправную точку для формирования страницы результатов. Для этого используются аргументы корневого поля пути, в качестве значения которых указывается полученный cursor:
before— объекты, идущие в списке перед указанным курсоромafter— объекты, следующие в списке после указанного курсора
Без указания количества возвращаемых объектов с помощью аргументов first или last система вернёт только ближайшие 10 записей.
{
instruments(first: 10, after: "MA==") {
edges {
cursor
node {
basicInformation {
...
}
}
}
}
}
Указанный в before/after курсор не входит в выборку на отображаемой странице.
Постраничная навигация
Для последовательной навигации по страницам используются данные типа PageInfo:
hasNextPage— существует ли в заданных условиях следующая страница (формат данныхBoolean)hasPreviousPage— существует ли в заданных условиях предыдущая страница (формат данныхBoolean)startCursor— первый курсор на отображаемой странице (формат данныхString)endCursor— последний курсор на отображаемой странице (формат данныхString)
Поле PageInfo структурно подчиняется напрямую корневому полю операции, в связи с чем должно располагаться на одном уровне с edges, а не внутри него:
{
instruments(first: 5, after: "MjQ=") {
edges {
cursor
node {
basicInformation {
...
}
}
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
}
}
{
"data": {
"instruments": {
"edges": [
{
"cursor": "MjU=",
"node": {
"basicInformation": {
...
}
}
},
{
"cursor": "MjY=",
"node": {
"basicInformation": {
...
}
}
},
{
"cursor": "Mjc=",
"node": {
"basicInformation": {
...
}
}
},
{
"cursor": "Mjg=",
"node": {
"basicInformation": {
...
}
}
},
{
"cursor": "Mjk=",
"node": {
"basicInformation": {
...
}
}
}
],
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "MjU=",
"endCursor": "Mjk="
}
}
}
}
Общее количество объектов
Определить суммарное количество записей в базе данных системы позволяет totalCount, располагающийся на одном уровне с edge и pageInfo:
{
instruments(first: 5, after: "MjQ=") {
edges {
cursor
node {
basicInformation {
...
}
}
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
totalCount
}
}
{
"data": {
"instruments": {
"edges": [
...
],
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "MjU=",
"endCursor": "Mjk="
},
"totalCount": 41357
}
}
}
Таким образом, полученный в ответе startCursor/endCursor можно использовать как новое значение аргумента before/after, значение hasNextPage/hasPreviousPage позволяет определить, возможно ли движение в заданном направлении, а общее количество объектов из totalCount позволяет создать список страниц для более удобной навигации.
Что дальше?
- Ознакомьтесь детальнее со спецификацией GraphQL, официальной документацией разработчиков и ответами на часто задаваемые вопросое
- Изучите базовый синтаксис GraphQL
- Узнайте о других дополнительных возможностях GraphQL API, доступных при взаимодействии с АЛОР Брокер API: постраничный вывод, фильтрация и сортировка данных
- Опробуйте полученные знания в веб-песочнице боевого или тестового контура