1

在以前的版本中,我能够使用以下方法从查询中检索结果:

            var facebookClient = new Facebook.FacebookClient(accessToken);
            const string fqlQuery = "select pic_big from user where uid=me()";
            dynamic result = facebookClient.Query(fqlQuery);

            var profilePhotoUrl = result[0].pic_big.ToString();

在版本 6 中,我可以完成相同的操作,但使用:

            var facebookClient = new Facebook.FacebookClient(accessToken);
            const string fqlQuery = "select pic_big from user where uid=me()";
            dynamic result = facebookClient.Get("fql", new { q = fqlQuery });

            var profilePhotoUrl = result.data[0].pic_big.ToString(); //v6.0 requires us to add ".data[0]" field 

新方法有效,但我只想确保:result.data[0].pic_big.ToString()是正确的。

4

2 回答 2

1

是的,您的新调用(包括数据属性)是正确的。我不确定更改背后的原因。包含 data 属性更准确地模拟了结果的 JSON 结构,但是因为我不知道数据元素是否已经存在。

无论如何:使用 data 属性是从现在开始的方式!

于 2012-09-27T21:09:28.397 回答
1

这是关于为什么需要.data在 v6 中的说明。

在 v5 中,我们将 rest api 用于 fql,因为它在 graph api 中尚不可用。Rest api 没有环绕,data所以你永远不必使用.data. 在 v5 的一些更高版本中,当 fb 宣布使用 graph api 支持 fql 时,我们使用移动到 graph api,但是为了避免 v5 中的破坏性更改,sdk.data在将结果返回给用户之前在内部删除了(丑陋的 hack)。

以下是 fql 使用图形 api 时 v5 的工作方式。

public virtual object Query(string fql)
{
    if (string.IsNullOrEmpty(fql))
        throw new ArgumentNullException("fql");

    var parameters = new Dictionary<string, object>();
    parameters["q"] = fql;

        // when using graph api
    var result = (IDictionary<string, object>)Get("fql", parameters);
    return result["data"];

    /*
        // when using rest api
    var parameters = new Dictionary<string, object>();
    parameters["query"] = fql;
    parameters["method"] = "fql.query";

    return Get(parameters);
    */
}

所以用户甚至不知道这种透明度。由于 v6 是一个主要版本,我们删除了Query由于这个丑陋的 hack 解决方法。使用 fql 的唯一方法是调用普通的 get。由于这会返回 fb 给出的确切结果,因此您需要包含.data.

于 2012-09-29T01:22:54.920 回答