【问题标题】:Best way to get a set of friends' names: javascript or server?获取一组朋友姓名的最佳方式:javascript 还是服务器?
【发布时间】:2011-12-03 06:11:28
【问题描述】:

我正在编写一些代码来处理应用程序邀请请求(FB.ui,方法 = apprequests),并希望在发送邀请后向用户显示一个包含用户的图片和姓名的块请求已发送。看来,这样做的唯一方法是通过对 /me/friends 的 API 调用获取所有用户朋友的姓名,并仔细阅读返回的对象,提取每个受邀用户的姓名。 C'est la guerre。

我有一些代码执行此操作,但我有点担心用户有大量朋友的情况下的性能 - /me/friends 将返回多达 5000 个朋友而不调用 'next ' 关联; Facebook 表示,普通用户大约有 120-130 个朋友。似乎有两种方法可以解决这个问题:

1:在浏览器中使用 Javascript 完成所有操作;这肯定是最直接的,但我担心 Javascript 实现在处理大量朋友时的效率——它必须处理一个包含所有朋友的相当大的对象,并且会花费大量花时间在那个大对象中寻找合适的对象。

2:将受邀者列表发布到我的服务器,这将调用 FB 以获取朋友并构造并返回用户名列表。我的直觉说,服务器将是一个更有能力(=更快,更不容易锁定)的引擎来做这些事情,也许足以让从 javascript 调用服务器并再次返回的成本是值得的.

但是,老实说,我真的不知道。有什么意见,希望知情的?无论哪种方式我都可以做到,但如果有类似最佳实践的东西,我想遵循它。谢谢!

【问题讨论】:

    标签: javascript facebook facebook-graph-api


    【解决方案1】:

    您不需要查询 /me/friends。当您进行 FB.ui 调用时,会出现一个回调,其中包含 request_id 和(在这种情况下更重要的是)被邀请用户的 fbid。

    您只需调用 :
    https://graph.facebook.com/{FRIEND_FBID} 即可直接搜索该用户。 即使使用 FQL,这些调用也相对较小,您不必担心性能。使用 Javascript SDK 的 Ajax 调用可以正常工作,就像将请求参数发布到您的服务器并在那里执行它们一样。 他们确实需要一些时间......但你真的不必担心。


    如果您的apprequests 被用于应用程序通知,那么您可能会设置一个数据库并存储他们的 FBID 引用的用户,您还可以查询您自己的数据库并检索您保存在用户首次访问。

    【讨论】:

    • 这有帮助;谢谢!我现在必须戴上我的半新手帽子,询问如何拨打graph.... 我可以看到在 Graph API Explorer 中工作;从 javascript,我尝试了 $.get("graph.facebook.com/THE_UID", function ...),但我收到 XMLHttpRequest 拒绝加载 URL 的错误(跨域问题?)。尝试 FB.api(THEUID, function ...) 让我得到一个基本的 Facebook 对象——uid、性别和其他一些东西,但不是名字。你能澄清一下吗?
    • 好吧,您的apprequest 通话已经完成了一半...这是javascript sdk api call documetation 的链接
    • 这就是我一直关注的,它没有给我名字。如果我运行(例如)FB.api("THEUID", function (the_result) { console.log(the_result); alert(the_result.name) });,则在 console.log 中显示的 the_result 的值有一个数字正确的属性,如性别和 id,但名称不是其中之一。 (顺便说一句,在运行之前已经调用了带有一些适当参数的 FB.init(...)。)有什么见解吗?我需要在其中获取访问令牌作为调用的显式部分吗?
    • 您可能想在facebook permissions 上阅读更多内容;您需要正确的权限才能查看有关用户朋友的信息。
    • 解决了,从某种意义上说。在请求处理程序中,我需要回调我的服务器以将请求 ID 保存在数据库中,以便在/如果用户授权应用程序时清除它们。在那里,在 graph.fb.com/uid 上调用 file_get_contents 工作得很好,所以我可以获取用户名,将它们与他们的 ID 配对,通过 JSON 将整个事情传回,然后让 JS 做它的事情。我永远无法获得 FB.api 调用来给我用户名,但感谢您的指点。
    【解决方案2】:

    发送应用请求后,您可以立即发出另一个请求。这就是我们在我们正在构建的 Facebook 应用程序中的做法:

    FB.ui(app_request_options, function(response) {
      if (response && response.request_ids && (! response.error)) {
        //Make another call to get the profile information
        FB.api('', {"ids" : response.request_ids.join(',')}, function(response2) {
          if (response2 && (! response2.error))  {
            for (request_obj in response2) {
              //Do stuff... Update UI, post back to server, etc.
            }
         }
     }
    

    我们会将这些信息发回服务器,但您可以使用名称、个人资料图片等更新 UI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      相关资源
      最近更新 更多