GraphQL 中基于游标的分页命名约定
Cursor Based Pagination Naming Convention in GraphQL
在GraphQL中API,我经常看到像NQ、MQ这样的命名约定作为游标中使用的参数。这是一个示例,如下所示,
"data": {
"items": {
"totalCount": 351,
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": false,
"endCursor": "Mw",
"startCursor": "MQ"
},
"edges": [
{
"cursor": "MQ",
"node": {
"id": "UGxhY2UtMzUy",
"displayName": "Redbeard"
}
},
{
"cursor": "Mg",
"node": {
"id": "UGxhY2UtMzUx",
"displayName": "Frey of Riverrun"
}
},
{
"cursor": "Mw",
"node": {
"id": "QmlsbGVyLTI=",
"displayName": "Something Else"
}
}
]
}
}
}
来源:
https://dev.to/tymate/first-dive-into-graphql-ruby-nak
其他示例包括这个 rails 示例:https://www.2n.pl/blog/graphql-pagination-in-rails
这些命名约定是什么?例如,您将如何分页?
中继服务器规范定义了应该如何进行分页以与 Relay GraphQL Client 兼容。虽然这不是完成分页的唯一方法,但它已发展成为一种标准 - 至少在示例中是这样,因为它可以很容易地被引用。
section on connections 提供了有关游标如何工作的更多信息:
每条边都有一个游标值。这个值是 - 他们所说的 - 一个不透明的值,意味着它不应该被服务器解释。它是一个 reference/a 指针,只有服务器可以解释。所以,如果你有一个获取一堆值的查询:
edges: [
{ cursor: "abc", node: {...} },
{ cursor: "def", node: {...} },
{ cursor: "ghi", node: {...} },
{ cursor: "jkl", node: {...} },
{ cursor: "mno", node: {...} }
]
您可以通过查看最后一个元素的光标来请求下一页 mno
并将其传递到查询中。
query {
manyQuery(first: 5, after: "mno") {
edges {
cursor
node {...}
}
}
}
这将为您提供接下来的 5 个节点。另见 this section on graphql.org。
所以回答你的问题:字符串可能包含服务器可以用来引用你的节点之一的任何内容。例如。数据库中的一个id。为了消除从 API 用户传递任意值的诱惑,这个字符串通常被编码为 base64 格式。该值对客户端应该没有意义,仅用于传递回服务器。
在GraphQL中API,我经常看到像NQ、MQ这样的命名约定作为游标中使用的参数。这是一个示例,如下所示,
"data": {
"items": {
"totalCount": 351,
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": false,
"endCursor": "Mw",
"startCursor": "MQ"
},
"edges": [
{
"cursor": "MQ",
"node": {
"id": "UGxhY2UtMzUy",
"displayName": "Redbeard"
}
},
{
"cursor": "Mg",
"node": {
"id": "UGxhY2UtMzUx",
"displayName": "Frey of Riverrun"
}
},
{
"cursor": "Mw",
"node": {
"id": "QmlsbGVyLTI=",
"displayName": "Something Else"
}
}
]
}
}
}
来源: https://dev.to/tymate/first-dive-into-graphql-ruby-nak
其他示例包括这个 rails 示例:https://www.2n.pl/blog/graphql-pagination-in-rails
这些命名约定是什么?例如,您将如何分页?
中继服务器规范定义了应该如何进行分页以与 Relay GraphQL Client 兼容。虽然这不是完成分页的唯一方法,但它已发展成为一种标准 - 至少在示例中是这样,因为它可以很容易地被引用。
section on connections 提供了有关游标如何工作的更多信息:
每条边都有一个游标值。这个值是 - 他们所说的 - 一个不透明的值,意味着它不应该被服务器解释。它是一个 reference/a 指针,只有服务器可以解释。所以,如果你有一个获取一堆值的查询:
edges: [
{ cursor: "abc", node: {...} },
{ cursor: "def", node: {...} },
{ cursor: "ghi", node: {...} },
{ cursor: "jkl", node: {...} },
{ cursor: "mno", node: {...} }
]
您可以通过查看最后一个元素的光标来请求下一页 mno
并将其传递到查询中。
query {
manyQuery(first: 5, after: "mno") {
edges {
cursor
node {...}
}
}
}
这将为您提供接下来的 5 个节点。另见 this section on graphql.org。
所以回答你的问题:字符串可能包含服务器可以用来引用你的节点之一的任何内容。例如。数据库中的一个id。为了消除从 API 用户传递任意值的诱惑,这个字符串通常被编码为 base64 格式。该值对客户端应该没有意义,仅用于传递回服务器。