微博sdk的設計 – JAVA編程語言程序開發技術文章

SDK代碼框架:
OAuth認證:
1.0:
clip_image002

2.0:
clip_image004

clip_image006

clip_image008

框架介紹:
主要分為幾個部分,核心httpClient部分,認證相關的token部分和api調用部分。

Weibo這個類是一個主體核心,調用的入口。

當用戶完成上面介紹的授權後,通過weibo這個類來調用api實現功能。

具體的步驟:
認證:
密鑰由App Secret和Token Secret組成(中間使用&符號分隔)
簽名算法目前隻支持HMAC-SHA1

RequestToken requestToken = weibo.getOAuthRequestToken(backUrl);

得到瞭requestToken。

把得到的requestToken中的request token存好,比如放到tair中。

跳轉訪問resToken.getAuthorizationURL()。

這個網頁帶入用戶到認證頁面,用戶登錄後認證成功。

返回到backUrl設定的callback頁面,並帶有請求參數oauth_verifier,如果oauth_verifier不為空,從tair中取出request token,用這兩個參數換取access Token。

AccessToken accessToken = weboauth.requstAccessToken(resToken, verifier);

如果這個accessToken不為空,則利用這個accessToken就可以調用api瞭。

調用:
每個調用接口類,通過httpClient構造一個httpRequest方法,get或者post,填充請求參數,然後通過URL的openConnection方法創建HttpURLConnection,並把所有請求參數設置到這個connection中去。然後連接即可。

所有的返回值都在這個connection的Stream中,將所有返回的值都作為inputStream讀入到Response對象,再利用具體的api對象(比如Status)將所有返回值轉化為json 格式,即完成瞭調用。

API設計:
新浪微博SDK的api設計風格,簡單講我覺得是力求最簡,而犧牲瞭一些所謂的設計美學。

Api的設計就是以Weibo類為核心的星型設計,所有的服務都統一走一個Weibo接口,其中包含瞭認證相關的,也包含瞭服務調用相關的,該類的代碼量為3446行。

所有的網絡訪問都組合瞭HttpClient,而這個和通常理解的httpclient一樣,負責進行網絡連接訪問。

所有的返回結果根據業務的不同也分為不同的類,比如Comment、User、Status等等,這些都是數據對象,繼承瞭WeiboResponse,WeiboResponse組合瞭Response這個自定義的類,Response通過依賴httpClient完成瞭所有的網絡操作。

總結,我個人感覺,新浪微博的SDK系統設計追求瞭極簡風格,模塊之間的實際耦合不大,但是代碼的組織結構較差,類名包名等區分度不高。

騰訊微博的SDK設計,相比新浪來說,結構上整潔瞭很多。這裡列出一些區別,騰訊的httpClient是直接調用apache的,多瞭一些依賴;另外,建立瞭OAuthClient和QHttpClient兩個類,分離瞭認證和調用兩套操作;api操作獨立繼承Request_API類,隔離瞭數據對象類到beans包裡,beans包下的對象都是domain對象,隻有get和set。

調用示例:

僅針對java api。

先來個新浪的call,

   1: String callback = "your callback url";
   2: String oauth_consumer_key = "your app key";
   3: String oauth_consumer_secret = "your app secret";
   4: RequestToken resToken = WebOAuth.request(callback);

這樣就得到requestToken瞭。這裡建議把這個token對象保存起來,新浪的是放到瞭session裡,我在應用中的實現是放到瞭一個nosql的緩存中。

然後把resToken.getAuthorizationURL()得到,跳轉到這個url去認證授權就好瞭。

在完成輸入用戶名和密碼的登錄授權後,微博平臺會跳轉回到callback設置的url來,這時需要繼續處理這個頁面訪問瞭。

首先從request裡把oauth_verifier得到,然後從session中或者緩存中把RequestToken拿回來。接著調用

   1: AccessToken accessToken = WebOAuth.requstAccessToken(
   2:                             resToken, verifier);

這時,得到瞭最重要的accessToken,把這個對象中的accessToken.getTokenSecret()和accessToken.getToken()存起來,最好持久化存儲。以後調用api時直接讀取這個token和secret就夠瞭。

然後調用一下api,發個微博試試吧:

   1: Weibo weibo = new Weibo();
   2: weibo.setToken(token, secret);
   3: Status status = weibo.updateStatus("hello sina weibo");

這樣就調通瞭,註意重要的是把token和secret存好。

騰訊的話很類似:

   1: String callback = link.render();
   2: String oauth_consumer_key = "801084288";
   3: String oauth_consumer_secret = "f48a8c2c8e6f6795bf635b751aa80555";
   4: OAuth oauth = new OAuth(oauth_consumer_key,
   5:                      oauth_consumer_secret, callback);
   6: OAuthClient oauthClient = new OAuthClient();
   7: // 獲取request token
   8: try {
   9:     oauth = oauthClient.requestToken(oauth);
  10: } catch (Exception e) {
  11:     // TODO Auto-generated catch block
  12:     e.printStackTrace();
  13: }
  14: if (oauth.getStatus() == 1) {
  15:     System.out.println("Get Request Token failed!");
  16:     return;
  17: } else {
  18:     String oauth_token = oauth.getOauth_token();
  19:     String url = "http://open.t.qq.com/cgi-bin/authorize?oauth_token="
  20:                         + oauth_token;
  21:     //把token存好,放到session或者cache裡
  22:     //跳轉到url
  23: }

這個call後,同樣到騰訊的頁面去輸入用戶名和密碼進行驗證。最後跳轉回callback設置的url。

   1: String callback = "your callback";
   2: String oauth_consumer_key = "your key";
   3: String oauth_consumer_secret = "your secret";
   4: OAuth oauth = new OAuth(oauth_consumer_key, oauth_consumer_secret,
   5:         callback);
   6: 
   7: String secret = cache.get(secret);//從緩存中把存進去的secret拿到
   8: oauth.setOauth_token(requestToken);
   9: oauth.setOauth_verifier(verify);
  10: oauth.setOauth_token_secret(secret);
  11: 
  12: OAuthClient authClient = new OAuthClient();
  13: try {
  14:     oauth = authClient.accessToken(oauth);
  15:     if (oauth.getStatus() == 2) {
  16:         System.out.println("Get Access Token failed!");
  17:         return;
  18:     } else {
  19:         //把accessToken和secret存好,然後調用api
  20:             T_API t_API = new T_API();
  21:             String response = t_API.add(oauth,
  22:                         WeiBoConst.ResultType.ResultType_Json,
  23:                         content, "127.0.0.1");
  24:     }
  25: } catch (Exception e) {
  26:     // TODO Auto-generated catch block
  27:     e.printStackTrace();
  28: }

最後總結性的說一句吧,我感覺新浪和騰訊都挺偷懶的,尤其是tx~~大傢的認識呢?

 

摘自 Change Dir

發佈留言