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~~大家的认识呢?