Change Dir

先知cd——热爱生活是一切艺术的开始

统计

留言簿(18)

积分与排名

“牛”们的博客

各个公司技术

我的链接

淘宝技术

阅读排行榜

评论排行榜

微博sdk的设计

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

posted on 2012-02-12 11:23 changedi 阅读(2283) 评论(1)  编辑  收藏 所属分类: Java技术

评论

# re: 微博sdk的设计 2012-02-13 11:33 nidie

阳光计划关爱流动儿童
“我喜欢看书,但家里的书不多,现在图书馆里多了1万本书,我真高兴!”来自四川攀枝花的张献(化名)是广州黄埔同仁小学6年级的学生。昨

天,由中国少年儿童基金会和安利公司合作、面对流动儿童启动的“阳光计划”大型公益活动开进这所专门接收外来务工者子弟的民办学校,为全校

1000多名“流动儿童”带来了1万册图书、1台电脑和1个大屏幕投影仪。
安利 www.hotunskin.com   回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: