GitHub 如何编码他们的 graphQL 游标?
How does GitHub encode their graphQL cursors?
GitHub 的 graphql 游标是有意不透明的,因此它们不应该被客户端解码。但是我想知道他们的分页方法,尤其是与排序结合使用时。
GitHub使用的分页游标的编码有多层编码。我从一个解码器的角度来依次列出:
- 光标字符串使用 URL safe base64 编码,这意味着它使用
-
和 _
而不是 +
和 /
。这可能是为了与他们基于 REST 的 API. 保持一致
- 解码 base64 字符串给我们另一个格式为
cursor:v2:[something]
的字符串,所以下一步是解码一些东西。
- 'something' 是包含实际游标属性的二进制编码数据。第一个字节定义游标类型:
0x91
=> 我们不使用任何排序,游标包含 id 字段的长度和 id 本身。 0xcd
似乎表示一个 two-byte id,0xce
一个 four-byte id。接下来是 id 本身,可以通过解码 base64 id
graphql 字段来验证。
0x92
=> 包含排序后的 属性 和 id 的复合游标。这是一个 length-prefixed 序数或两个字节加上一个字符串或 ISO 日期字符串,后跟 length-prefixed id。
GitHub 的 graphql 游标是有意不透明的,因此它们不应该被客户端解码。但是我想知道他们的分页方法,尤其是与排序结合使用时。
GitHub使用的分页游标的编码有多层编码。我从一个解码器的角度来依次列出:
- 光标字符串使用 URL safe base64 编码,这意味着它使用
-
和_
而不是+
和/
。这可能是为了与他们基于 REST 的 API. 保持一致
- 解码 base64 字符串给我们另一个格式为
cursor:v2:[something]
的字符串,所以下一步是解码一些东西。 - 'something' 是包含实际游标属性的二进制编码数据。第一个字节定义游标类型:
0x91
=> 我们不使用任何排序,游标包含 id 字段的长度和 id 本身。0xcd
似乎表示一个 two-byte id,0xce
一个 four-byte id。接下来是 id 本身,可以通过解码 base64id
graphql 字段来验证。0x92
=> 包含排序后的 属性 和 id 的复合游标。这是一个 length-prefixed 序数或两个字节加上一个字符串或 ISO 日期字符串,后跟 length-prefixed id。