SDK代碼框架:
OAuth認(rèn)證:
1.0:
2.0:
框架介紹:
主要分為幾個(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í)呢?