3

我将使用 RESTful Web Services 和HttpClient来访问Facebook API REST Server

我对 REST 和 Facebook API 有点陌生……

问题):

验证/授权

(1) 如果我有一个客户端应用程序发送的会话密钥,我如何验证和验证用户是否存在,然后在服务器端查询他/她的朋友?

如何访问这些 Facebook RESTful 端点:

http://wiki.developers.facebook.com/index.php/Users.getInfo

http://wiki.developers.facebook.com/index.php/Friends.getLists

通过 HTTP GET 请求?意思是,包含参数的完整 URL 是什么样的?

(2) 获取 API(我在上面列出的)的完整 RESTful URL 是什么样的?

发布到朋友的墙上

(3) 验证/授权后,查询用户好友,我将如何(哪个API)发帖到好友墙?

(4) 是否需要将任何其他参数附加到 Facebook RESTful 服务器的 URL?

HTTP 客户端

(5) 我是否通过 HttpClient 在我的 Java 程序中包含对这些 Facebook API 的 RESTful Web 服务调用?

编程愉快,感谢您抽出宝贵时间阅读本文...

4

2 回答 2

1

我不能回答你所有的问题,但方法调用是通过http://api.facebook.com/restserver.php调用users.getInfo看起来像这样

http://api.facebook.com/restserver.php?method=users.getinfo

您还需要传入您的 api 密钥和该方法所需的任何其他参数。但是,与其自己进行 http 调用,不如必须有一些 Java 库为您抽象出所有这些。

至于这是一个 REST API - 在 URL 中有一个带有方法范围的 Web 服务端点,所有调用都是通过 HTTP GET 或 POST 进行的。

坦率地说,这是基于 HTTP 的 RPC,并且与 REST 相距甚远(没有双关语!)。Facebook 应该更改他们的 API 文档,这是完全错误的。

于 2009-11-17T07:53:16.207 回答
0

在创建 URL 方面,我使用了这段代码,它似乎工作得很好......

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

// Written by Stuart Davidson, www.spedge.com
public class JSONComm 
{   
private final String JSON_URL = "http://api.facebook.com/restserver.php";
private final String fbSecretKey = "xxx";
private final String fbApiKey = "xxx";
private final String fbApiId = "xxx";

private int callId = 0;

public int getNextCall() { callId++; return callId; }
public String getApiKey() { return fbApiKey; }
public String getApiId() { return fbApiId; }

public String getRestURL(HashMap<String, String> args)
{
    String url = JSON_URL + "?";
    for(String arg : args.keySet()) { url = url + arg + "=" + args.get(arg) + "&"; }

    String sig = getMD5Hash(args);
    url = url + "sig=" + sig;

    return url;
}

public String getMD5Hash(HashMap<String, String> args)
{   
    String message = "";

    Vector<String> v = new Vector<String>(args.keySet());
    Collections.sort(v);
    Iterator<String> it = v.iterator();

    while(it.hasNext()) 
    { 
        String tmp = it.next();
        message = message + tmp + "=" + args.get(tmp);
    }

    message = message + fbSecretKey;

    try{
        MessageDigest m = MessageDigest.getInstance("MD5");
        byte[] data = message.getBytes(); 
        m.update(data,0,data.length);
        BigInteger i = new BigInteger(1,m.digest());
        return String.format("%1$032X", i).toLowerCase();
    }
    catch(NoSuchAlgorithmException nsae){ return ""; }
}
}

确保您看到了关键部分 - 参数按字母顺序排序的事实,并且整个内容使用 MD5 加密,但加密的字符串与 URL 字符串略有不同。

另请注意,API 密钥需要填写!

因此,要获取方法 User.getInfo 的 URL 并返回名字和姓氏,我将执行以下操作...

public String getFbURL(String callback, Long playerId)
{
    HashMap<String, String> args = new HashMap<String, String>();
    args.put("api_key", jsonComm.getApiKey());
    args.put("call_id", "" + jsonComm.getNextCall());
    args.put("v", "1.0");
    args.put("uids", "" + playerId);
    args.put("fields", "first_name,last_name");
    args.put("format", "JSON");
    args.put("method", "Users.getInfo");
    args.put("callback", "" + callback);

    return jsonComm.getRestURL(args);
}

希望这可以帮助 :)

于 2010-03-07T09:37:06.090 回答