微博sdk的设计 (一)

2014-11-24 07:17:15 · 作者: · 浏览: 2
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: