<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Change Dir

    先知cd——熱愛(ài)生活是一切藝術(shù)的開(kāi)始

    統(tǒng)計(jì)

    留言簿(18)

    積分與排名

    “?!眰兊牟┛?/h3>

    各個(gè)公司技術(shù)

    我的鏈接

    淘寶技術(shù)

    閱讀排行榜

    評(píng)論排行榜

    微博sdk的設(shè)計(jì)

    SDK代碼框架:

    OAuth認(rèn)證:

    1.0:

    clip_image002

    2.0:

    clip_image004

    clip_image006

    clip_image008

    框架介紹:

    主要分為幾個(gè)部分,核心httpClient部分,認(rèn)證相關(guān)的token部分和api調(diào)用部分。

    Weibo這個(gè)類(lèi)是一個(gè)主體核心,調(diào)用的入口。

    當(dāng)用戶完成上面介紹的授權(quán)后,通過(guò)weibo這個(gè)類(lèi)來(lái)調(diào)用api實(shí)現(xiàn)功能。

    具體的步驟:
    認(rèn)證:

    密鑰由App Secret和Token Secret組成(中間使用&符號(hào)分隔)
    簽名算法目前只支持HMAC-SHA1

    RequestToken requestToken = weibo.getOAuthRequestToken(backUrl);

    得到了requestToken。

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

    跳轉(zhuǎn)訪問(wèn)resToken.getAuthorizationURL()。

    這個(gè)網(wǎng)頁(yè)帶入用戶到認(rèn)證頁(yè)面,用戶登錄后認(rèn)證成功。

    返回到backUrl設(shè)定的callback頁(yè)面,并帶有請(qǐng)求參數(shù)oauth_verifier,如果oauth_verifier不為空,從tair中取出request token,用這兩個(gè)參數(shù)換取access Token。

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

    如果這個(gè)accessToken不為空,則利用這個(gè)accessToken就可以調(diào)用api了。

    調(diào)用:

    每個(gè)調(diào)用接口類(lèi),通過(guò)httpClient構(gòu)造一個(gè)httpRequest方法,get或者post,填充請(qǐng)求參數(shù),然后通過(guò)URL的openConnection方法創(chuàng)建HttpURLConnection,并把所有請(qǐng)求參數(shù)設(shè)置到這個(gè)connection中去。然后連接即可。

    所有的返回值都在這個(gè)connection的Stream中,將所有返回的值都作為inputStream讀入到Response對(duì)象,再利用具體的api對(duì)象(比如Status)將所有返回值轉(zhuǎn)化為json 格式,即完成了調(diào)用。

    API設(shè)計(jì):

    新浪微博SDK的api設(shè)計(jì)風(fēng)格,簡(jiǎn)單講我覺(jué)得是力求最簡(jiǎn),而犧牲了一些所謂的設(shè)計(jì)美學(xué)。

    Api的設(shè)計(jì)就是以Weibo類(lèi)為核心的星型設(shè)計(jì),所有的服務(wù)都統(tǒng)一走一個(gè)Weibo接口,其中包含了認(rèn)證相關(guān)的,也包含了服務(wù)調(diào)用相關(guān)的,該類(lèi)的代碼量為3446行。

    所有的網(wǎng)絡(luò)訪問(wèn)都組合了HttpClient,而這個(gè)和通常理解的httpclient一樣,負(fù)責(zé)進(jìn)行網(wǎng)絡(luò)連接訪問(wèn)。

    所有的返回結(jié)果根據(jù)業(yè)務(wù)的不同也分為不同的類(lèi),比如Comment、User、Status等等,這些都是數(shù)據(jù)對(duì)象,繼承了WeiboResponse,WeiboResponse組合了Response這個(gè)自定義的類(lèi),Response通過(guò)依賴(lài)httpClient完成了所有的網(wǎng)絡(luò)操作。

    總結(jié),我個(gè)人感覺(jué),新浪微博的SDK系統(tǒng)設(shè)計(jì)追求了極簡(jiǎn)風(fēng)格,模塊之間的實(shí)際耦合不大,但是代碼的組織結(jié)構(gòu)較差,類(lèi)名包名等區(qū)分度不高。

    騰訊微博的SDK設(shè)計(jì),相比新浪來(lái)說(shuō),結(jié)構(gòu)上整潔了很多。這里列出一些區(qū)別,騰訊的httpClient是直接調(diào)用apache的,多了一些依賴(lài);另外,建立了OAuthClient和QHttpClient兩個(gè)類(lèi),分離了認(rèn)證和調(diào)用兩套操作;api操作獨(dú)立繼承Request_API類(lèi),隔離了數(shù)據(jù)對(duì)象類(lèi)到beans包里,beans包下的對(duì)象都是domain對(duì)象,只有g(shù)et和set。

    調(diào)用示例:

    僅針對(duì)java api。

    先來(lái)個(gè)新浪的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了。這里建議把這個(gè)token對(duì)象保存起來(lái),新浪的是放到了session里,我在應(yīng)用中的實(shí)現(xiàn)是放到了一個(gè)nosql的緩存中。

    然后把resToken.getAuthorizationURL()得到,跳轉(zhuǎn)到這個(gè)url去認(rèn)證授權(quán)就好了。

    在完成輸入用戶名和密碼的登錄授權(quán)后,微博平臺(tái)會(huì)跳轉(zhuǎn)回到callback設(shè)置的url來(lái),這時(shí)需要繼續(xù)處理這個(gè)頁(yè)面訪問(wèn)了。

    首先從request里把oauth_verifier得到,然后從session中或者緩存中把RequestToken拿回來(lái)。接著調(diào)用

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

    這時(shí),得到了最重要的accessToken,把這個(gè)對(duì)象中的accessToken.getTokenSecret()和accessToken.getToken()存起來(lái),最好持久化存儲(chǔ)。以后調(diào)用api時(shí)直接讀取這個(gè)token和secret就夠了。

    然后調(diào)用一下api,發(fā)個(gè)微博試試吧:

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

    這樣就調(diào)通了,注意重要的是把token和secret存好。

    騰訊的話很類(lèi)似:

       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:     //跳轉(zhuǎn)到url
      23: }

    這個(gè)call后,同樣到騰訊的頁(yè)面去輸入用戶名和密碼進(jìn)行驗(yàn)證。最后跳轉(zhuǎn)回callback設(shè)置的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);//從緩存中把存進(jìn)去的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:         //把a(bǔ)ccessToken和secret存好,然后調(diào)用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: }

    最后總結(jié)性的說(shuō)一句吧,我感覺(jué)新浪和騰訊都挺偷懶的,尤其是tx~~大家的認(rèn)識(shí)呢?

    posted on 2012-02-12 11:23 changedi 閱讀(2321) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Java技術(shù)

    評(píng)論

    # re: 微博sdk的設(shè)計(jì) 2012-02-13 11:33 nidie

    陽(yáng)光計(jì)劃關(guān)愛(ài)流動(dòng)兒童
    “我喜歡看書(shū),但家里的書(shū)不多,現(xiàn)在圖書(shū)館里多了1萬(wàn)本書(shū),我真高興!”來(lái)自四川攀枝花的張獻(xiàn)(化名)是廣州黃埔同仁小學(xué)6年級(jí)的學(xué)生。昨

    天,由中國(guó)少年兒童基金會(huì)和安利公司合作、面對(duì)流動(dòng)兒童啟動(dòng)的“陽(yáng)光計(jì)劃”大型公益活動(dòng)開(kāi)進(jìn)這所專(zhuān)門(mén)接收外來(lái)務(wù)工者子弟的民辦學(xué)校,為全校

    1000多名“流動(dòng)兒童”帶來(lái)了1萬(wàn)冊(cè)圖書(shū)、1臺(tái)電腦和1個(gè)大屏幕投影儀。
    安利 www.hotunskin.com   回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 亚洲AV无码一区二区一二区| 韩国二级毛片免费播放| 久久久久国产亚洲AV麻豆| 成人精品国产亚洲欧洲| 国产免费卡一卡三卡乱码| 国产精品亚洲专区无码不卡| 国产无遮挡又黄又爽免费视频| 亚洲国产精品视频| 高清免费久久午夜精品| 亚洲一级毛片免费看| 99久久亚洲精品无码毛片| 永久看日本大片免费35分钟| 亚洲日本在线观看网址| 日韩精品成人无码专区免费| 亚洲精品天堂无码中文字幕| 凹凸精品视频分类国产品免费| 一级做α爱过程免费视频| 亚洲精品夜夜夜妓女网| 最近中文字幕免费mv在线视频| wwwxxx亚洲| 国产乱色精品成人免费视频| 久久久免费观成人影院| 亚洲国产精品无码成人片久久 | 亚洲v高清理论电影| 免费三级毛片电影片| 精品亚洲成A人在线观看青青| 久久精品国产亚洲5555| 99在线在线视频免费视频观看| 亚洲av午夜精品无码专区| 三级黄色免费观看| www.亚洲精品| 九九美女网站免费| 国产性爱在线观看亚洲黄色一级片| 久久久久久AV无码免费网站下载 | 国产成人AV片无码免费| 亚洲一区二区三区无码国产| 凹凸精品视频分类国产品免费| 国产成人免费ā片在线观看老同学 | 久久国产色AV免费观看| 亚洲国产成人无码AV在线影院| 国产亚洲精品久久久久秋霞|