SDK代碼框架:
OAuth認證:
1.0:
2.0:
框架介紹:
主要分為幾個部分,核心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~~大家的認識呢?