使用javascript使用fql批量请求

时间:2012-06-11 21:06:11

标签: javascript facebook-fql facebook-javascript-sdk

使用同一个应用程序检索朋友的以下批量请求无效:

var search = {batch: [
    {
      'name' : 'getFriends',
      'relative_url': 'method/fql.query?query=SELECT+uid,+first_name,+name,+pic_square,+pic_small+FROM+user+WHERE+is_app_user=1+and+uid+IN+(SELECT+uid2+FROM+friend+WHERE+uid1=' + userId + ')'
    },
    {
      'method': 'get',
      'relative_url': '{result=getFriends:$.data[*].uid}/news.reads/article', 
    }
]};

并且以下代码执行批处理请求:

FB.api('/', 'post', search, function(response) {
    console.log(response);
});

但第一次搜索返回 null 。查询出了什么问题?

根据批量请求的facebook文档,* relative_url *是

  

(...)relative_url(graph.facebook.com之后的URL部分)

here获取。

所以我把第一个代码块改为:

var search = {batch: [
    {
        'name' : 'getFriends',
        'method' : 'GET',
        'relative_url': 'method/fql?q=SELECT uid, first_name, name, pic_square, pic_small FROM user WHERE is_app_user=1 and uid IN (SELECT uid2 FROM friend WHERE uid1=me())'
    },
    {
        'method': 'GET',
        'relative_url': '{result=getAmigos:$.data[*].uid}/news.reads/article'
    }
]};

批处理中第一个块的 relative_url 在Facebook的Open Graph API Tool上工作,但在JS处,http代码为500,消息正文为:

{
    "error": {
        "message": "Graph batch API does not allow REST API method fql",
        "type": "FacebookApiException",
        "code": 3
    }
}

但是在api批处理请求文档允许fql查询。文档已经过时了?我应该打开一个错误吗?

P.S:没有批处理请求的fql是

SELECT uid, first_name, name, pic_square, pic_small 
FROM user WHERE is_app_user=1 
     and uid IN (SELECT uid2 FROM friend WHERE uid1 = me())

2 个答案:

答案 0 :(得分:1)

不要使用method/fql; Facebook的FQL端点现在只有fql

...
"name": "getFriends",
"method": "GET",
"relative_url": "fql?q=SELECT...",
...

答案 1 :(得分:0)

它现在正在运作。我只是在批处理对象中添加access_token参数。像这样:

var searchArgs = {
   access_token: FB.getAuthResponse().access_token,
   batch: []
};

searchArgs.batch.push({
     'method': 'GET',
     'name': 'amigosapp',
     'relative_url': 'method/fql.query?query=SELECT+uid,+first_name,+name,+pic_square,+pic_small+FROM+user+WHERE+is_app_user=1+and+uid+IN+(SELECT+uid2+FROM+friend+WHERE+uid1=me())&limit=20',
     'omit_response_on_success': false
});

searchArgs.batch.push({
     'method': 'GET',
     'relative_url': 'news.reads/article?date_format=U&ids={result=amigosapp:$.[*].uid}'
});

另一个技巧是以不同的方式使用 jsonpath 表达式。我无法为第一个请求的每个用户发出第二个请求。所以我改变了在图api请求结束时添加朋友ID的方法。我认为我第一次考虑每位朋友的请求时,无法使用批量请求。

然后我做了批次的调用:

FB.api('/', 'POST', searchArgs,
    function(response) {
        var friends = response[0].body;
        console.log(friends);
        var activities = response[1].body;
        console.log(activities);
    }
);

现在它只是组织检索的帖子。

[]的