【问题标题】:Access to Facebook API using REST and HttpClient使用 REST 和 HttpClient 访问 Facebook API
【发布时间】:2010-11-27 02:29:11
【问题描述】:

我将使用 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 服务调用?

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

【问题讨论】:

    标签: java rest facebook httpclient


    【解决方案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 文档,这是完全错误的。

    【讨论】:

      【解决方案2】:

      在创建 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);
      }
      

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-17
        • 2019-02-16
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        相关资源
        最近更新 更多