Change Dir

          先知cd——熱愛生活是一切藝術的開始

          統計

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個公司技術

          我的鏈接

          淘寶技術

          閱讀排行榜

          評論排行榜

          微博sdk的設計

          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~~大家的認識呢?

          posted on 2012-02-12 11:23 changedi 閱讀(2315) 評論(1)  編輯  收藏 所屬分類: Java技術

          評論

          # re: 微博sdk的設計 2012-02-13 11:33 nidie

          陽光計劃關愛流動兒童
          “我喜歡看書,但家里的書不多,現在圖書館里多了1萬本書,我真高興!”來自四川攀枝花的張獻(化名)是廣州黃埔同仁小學6年級的學生。昨

          天,由中國少年兒童基金會和安利公司合作、面對流動兒童啟動的“陽光計劃”大型公益活動開進這所專門接收外來務工者子弟的民辦學校,為全校

          1000多名“流動兒童”帶來了1萬冊圖書、1臺電腦和1個大屏幕投影儀。
          安利 www.hotunskin.com   回復  更多評論   

          主站蜘蛛池模板: 拜泉县| 德江县| 比如县| 秦安县| 忻州市| 安陆市| 绥宁县| 荆州市| 哈尔滨市| 湖南省| 五河县| 金山区| 堆龙德庆县| 宿迁市| 包头市| 宁强县| 上饶县| 河西区| 远安县| 盱眙县| 壤塘县| 甘南县| 巩义市| 临泽县| 军事| 桐庐县| 许昌市| 潼关县| 三江| 肃北| 文安县| 惠安县| 乐陵市| 新化县| 舞阳县| 宿州市| 突泉县| 潞城市| 大港区| 通江县| 上虞市|