Facebook graph api 为什么通常将分页游标或id值编码为字符串?

Facebook graph api 为什么通常将分页游标或id值编码为字符串?,facebook-graph-api,cursor,base64,Facebook Graph Api,Cursor,Base64,例如,Facebook Graph API:为什么在之后而在之前是base64编码的数字 { "data": [ ... Endpoint data is here ], "paging": { "cursors": { "after": "MTAxNTExOTQ1MjAwNzI5NDE=", "before": "NDMyNzQyODI3OTQw" }, "previous": "https://graph.facebook

例如,Facebook Graph API:为什么
之后而
之前是base64编码的数字

{
  "data": [
     ... Endpoint data is here
  ],
  "paging": {
    "cursors": {
      "after": "MTAxNTExOTQ1MjAwNzI5NDE=",
      "before": "NDMyNzQyODI3OTQw"
    },
    "previous": "https://graph.facebook.com/me/albums?limit=25&before=NDMyNzQyODI3OTQw"
    "next": "https://graph.facebook.com/me/albums?limit=25&after=MTAxNTExOTQ1MjAwNzI5NDE="
  }
}
与普通数字相比,它可能带来什么好处

正如下面的python日志所示,好处不能是数据的更短表示形式或包含不安全字符的数据:

>>> base64.b64decode("MTAxNTExOTQ1MjAwNzI5NDE=")
'10151194520072941'
>>> len('10151194520072941')
17
>>> len("MTAxNTExOTQ1MjAwNzI5NDE=")
24
如果你说的是纯数字时使用基数10(十进制),那么优势在于基数64更紧凑,使用更少的数字(10位数的基数10数字(例如100000000)在基数64中只能用5位数表示(例如F9eEA)),以及(如你所说)隐藏实现细节

如果说纯数字是指使用原始二进制数据,那么Base64使用的字符几乎总是可以安全地通过internet、URL等进行传输,而不会将某些字符解释为控制字符(传输原始二进制数据时存在风险)。有关更多信息,请参阅

无论哪种情况,使用base64都有好处

编辑:


我明白你的意思了,前面列出的优点不适用于这种情况。Facebook可能使用base64与其他API函数保持一致,并隐藏实现细节。如果他们将来修改它以允许其他字符,以及容忍潜在的错误请求(假设错误发生在base64转换之前),这也可能是有利的。

根据StackOverflow中提出的问题,JavaScript中可能的最高数字是9007199254740992

如果比较这些值

9007199254740992    // the JS maximum
10151194520072941   // the Base64 encoded number
如果Facebook看起来确实像是在内部——出于我们不知道的原因——存储的值太大,JavaScript数字精度无法处理

因此,在我看来,他们除了把数字当作字符串来处理外,别无选择

当然,他们可以使用
“10151194520072941”
作为字符串格式的数字,但一些程序员可能会将其混淆为数字。尽管这种情况很少发生,但他们可能认为Base64编码数字可以避免将字符串转换为整数的问题

此外,由于这是一个公共API函数,他们自己的工程师不使用它,因此风险更高,因为使用API的人来自不同的教育背景。他们可能会意外地使用例如parseInt或类似的数字,从而导致不必要的客户服务请求


编辑:使用非常大的数字可能还有另一个目的:检测API的故意滥用。如果他们将使用随机UUID值或连续的数值,任何接近值都可能是合法的。如果是UUID,他们必须首先发出请求,查看它是否是合法条目。有一个很大的基数,可能是每1000次才是合法的,或者他们遵循一些其他数学规则,这些规则可以被单个服务器检测到,而不需要向其他服务器发出请求,对那些故意制造非法值请求的客户端进行分类会更加有效,并且可能可以在它们到达数据库之前过滤掉。

感谢您的回答。我编辑了我的问题,以表明这两种解释似乎都不适用。我用一些新的潜在解释编辑了我的答案。这个答案很有意义。这也意味着FB可以保留某些非数字ID或ID,以满足各种系统原因。如果您没有看到,我几天前编辑了我的答案,并给出了其他可能的解释。如果您将大64位数字编码为可打印的表示形式,则Base 64仅作为“压缩”机制才有意义。例如
len('\x00\x00\x00\x00\x00\x00\x00\x00\x01'.encode('base64'))=13
len('72057594037927936')=17
。我认为做出这一决定的唯一原因是提供一个更不透明的接口。它说的是“不要依赖这个数字来做有意义的事情”。我不太确定我是否同意滥用检测,但单是最大整数论证就已经是一个很好的理由了!谢谢你的回答!我认为,当你认为某些语言自动将字符串转换成数字,你只注意到当你处理的数字高于最大值时,这个数字的论证就特别好,所以错误很少发生,或者取决于UsEnk中的设备,我只是在想,使用数字而不是更常见的UUID的原因可能是什么——可能是他们已经注意到人们试图通过“猜测”下一个正确的ID来入侵系统——在数字空间留出更多空间会产生“陷阱”猜测会落在哪里,这些漏洞甚至可能是系统性的——很难辩称下一个数字是base64编码的,这是一个意外,也很难检测它是否没有编码——但如果你愿意,我可以从答案中删除这种猜测