向 Facebook 查询正在使用/可以使用的 Graph API 版本

Posted

技术标签:

【中文标题】向 Facebook 查询正在使用/可以使用的 Graph API 版本【英文标题】:Query Facebook for what version of the Graph API is being used / can be used 【发布时间】:2014-08-12 04:57:55 【问题描述】:

我是利用 Facebook Graph API 的 Wordpress 插件的作者。最近,新插件用户的一些 Graph 调用失败(只有新用户受到影响)。经过一番挖掘,我相信我在这里偶然发现了原因:https://developers.facebook.com/docs/apps/versions

特别是“我的应用可以调用比当前版本更早的版本吗?”部分。状态:

应用可以调用创建应用时可用的最新 API 版本

换句话说,即使我的 Graph 调用指定了显式版本(即https://graph.facebook.com/v2.0/me),对于新创建的应用程序,Facebook 也会简单地忽略“v2.0”并调用 2.1。事实上,一个 FQL 查询如下:

https://graph.facebook.com/v2.0/fql?q=(myquery)&access_token=(mytoken)

产量:

"error": "message": "(#12) fql is deprecated for versions v2.1 and higher", "type": "OAuthException", "code": 12

这就引出了我的第一个问题:我在这里遗漏了什么吗?对我来说,这种行为似乎让版本控制变得毫无用处。无论我的调用是否指定 v2.0,Facebook 都只会调用该应用程序创建时存在的最新版本。因此,Facebook 为支持旧 api 版本(参见https://developers.facebook.com/docs/apps/upgrading)提供的两年时间窗口什么也没做,因为我总是需要在最新版本发布时支持它(否则使用新创建的应用程序的新用户将被破坏)。对吧?

第二个问题(假设以上是正确的):我如何查询 Facebook 以获取当前应用程序正在使用(或者更确切地说,可以使用)的版本?由于明确指定 v2.0 并不意味着它实际上会使用 v2.0,因此找出它是否使用意外版本至少可以帮助预防可能的错误 - 即包含在用户错误报告中的有价值的信息。我希望这些信息必须以某种方式在 access_token 中,但我已经搜索了高低,无法弄清楚如何问,“这个令牌适用于什么 API 版本”(或者,“什么 API 版本可以做到这一点应用程序支持,”或类似的)?

【问题讨论】:

我两天前得到的东西仍然没有得到任何答案。请帮忙.. 【参考方案1】:

您必须区分 API 版本和应用创建。正如您所说的那样,Facebook 在继任者宣布后正好 2 年支持旧版本的 Graph API。

https://developers.facebook.com/docs/apps/versions#howlong state 的文档

在后续版本发布之日起两年后,该版本将不再可用。

因此,如果 API 2.0 版于 2014 年 4 月 30 日发布,API 2.1 版于 2014 年 8 月 7 日发布,那么 v2.0 将于 2016 年 8 月 7 日到期,即 v2.1 发布两年后。

如果您在没有指定版本信息的情况下调用 Graph API 会发生以下情况:

未版本化的调用将默认使用 API 的最旧可用版本

意味着您的应用是在 2014 年 8 月 1 日创建的,您可以调用 v2.0,但不能调用 v1.0。如果您的应用程序是在 2014 年 4 月 1 日创建的,您将能够调用 v1.0(但只能在 2015 年 4 月 30 日弃用 v1.0 之前)。如果您的应用是在 2014 年 8 月 7 日之后创建的,则无论您指定什么版本,您都只能调用 v2.1。

这在

https://developers.facebook.com/docs/apps/versions#unversioned_calls https://developers.facebook.com/docs/apps/versions#calling_older_versions

应用可以调用创建应用时可用的最新 API 版本,以及创建应用后启动的任何更新的、未弃用的版本。

因此,换句话说,它始终与您的 Facebook 应用程序的创建日期更相关,因为这将决定应用程序能够使用的 Graph API 版本

要确定应用的创建日期,您可以使用

/app_id?fields=id,creation_time

endpoint,它将在创建相应应用程序时为您提供 Unix 时间戳。请参阅https://developers.facebook.com/docs/graph-api/reference/v2.1/app/#readfields 然后您可以使用例如 phpjavascript 将 Unix 时间戳转换为日期。

【讨论】:

是的,我确实阅读了所有这些内容。在我看来,Facebook 会提供一个版本化的 API 并声称它们允许我们选择要使用的版本,但随后甚至不尊重该选择。 关于确定版本:我想看看创建日期,在他们的文档中手动查找他们的发布时间表,并使用这些来推断 API 版本是可行的。有点。但这似乎是一个非常迂回/糟糕的解决方案(即,必须在一天中的什么时间创建应用程序才能被视为预发布或发布后?以及在哪个时区)?应该有一种更可靠的方法来直接以编程方式查询实际使用的版本 - 不要从其他信息中猜测它(并且需要人工阅读他们的文档并跟踪发布日期) . 我认为他们的文档很清楚该做什么。如果你仔细阅读它,你会明白你可以使用版本化的 API,但只能向上。这已明确说明,并且从发布日期开始,您可以为调用开发逻辑。而且,顺便说一句,我想我回答了你的两个问题 是的,你做到了。我的评论不是关于你的答案的质量——只是 API 的糟糕设计 :) 我想把这个问题留得更久一点,以防有人能想出一个更程序化的方法(即不是需要人工阅读文档并手动跟踪发布日期和版本)...但是如果经过一段时间后,似乎 FB 似乎没有提供合理的方法来做到这一点,当然我会接受你的:) 我可以理解,但我认为没有编程方式。不幸的是,Graph API 在某些方面并不完整,恕我直言,每个版本的情况甚至变得更糟。【参考方案2】:

请注意,检查应用年龄的功能略有变化。现在是:

/app_id?fields=id,created_time

它现在还返回一个实际的时间戳

"id": "12341234123412341234fake", “created_time”:“2011-11-30T21:00:56+0000”

手动测试的简单方法是通过此处的 Graph API Explorer:https://developers.facebook.com/tools/explorer/

请务必选择正确的应用和应用令牌。

【讨论】:

以上是关于向 Facebook 查询正在使用/可以使用的 Graph API 版本的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIWebView 登录 Facebook 和 G+

从 Facebook 应用程序向用户的 Facebook 好友发送消息

如何使用图形 API 查询公共 Facebook 事件? [更新搜索]

Spring Boot OAuth2 - 使用本地用户数据库向 Facebook 进行身份验证

FQL 查询未返回所有数据

Facebook iOS SDK - 向 facebook 用户发送应用请求