当前位置:编程学习 > JAVA >>

微博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:     &nbs

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,