Android腾讯微博开发入门之开题与BaseString

鉴客 发布于 2011/11/22 07:43
阅读 587
收藏 1

2011年,开放元年,各大平台竞相开放,开发者们乐此不彼。但是作为进入开发平台的第一步,授权,却把很多开发者搞得晕头转向。个人学习开放平台从新浪微博入手,因频频不能得手,中途转战腾讯微博,遇到问题就在技术讨论群里发问,奈何大都是新手,且开发语言不一,能帮忙者甚少。功夫不负有心人,就在那仅有的几个的帮助下,加上自己的努力,终于打通了各个环节,成功发布了第一条微博,并且完成了一个简单应用,参与光棍节主题大赛。

 现在个人想把应用移植到新浪微博、网易微博等其他开发平台,于是开始又回到新浪。虽然都是Oauth(此处Oauth表示Oauth1.0,下文及该系列后续文章所述Oauth亦均表示Oauth1.0)授权,但细节上却依然有很多不同。新浪Oauth授权http请求方式为post,个人成功获取了 reqeust_token,在以同样的方法获取access_token却未能成功;网易微博开放平台文档提示其Oauth授权http请求方式为 get,但个人在实际调试中,却发现用post和get均可获取request_token,但是同样以获取request_token的方法去获取 access_token却都不行,至今没弄懂起起其中,所以在此分享腾讯的代码,也是希望其他朋友能够提供新浪和网易等其他平台授权代码,以供大家相互学习。

 

在腾讯微博开放平台,遇到大小问题如下:

1、urlencode:由于对http并不是熟悉,所以一开始并不知道urlencode是什么,后来稍微看懂了一点,就想自己写函数,却不知系统都有现成的函数,晕死。

解:UrlEncode,即将字符串以URL编码。Android中实际采用java.net.URLEncoder类,使用方法如 URLEncoder.encode(<A href="http://www.csdn.net,"UTF-8">http://www.csdn.net,"UTF-8")。

2、baseString:这一点,新浪、网易、腾讯给出的文档还是可以帮助开发者理解的,本身实现也不难,主要即使参数排序和encode处理。但是有时候,开发者们都对此简单的东西不太感兴趣,有时候都懒得去敲键盘,总想找开源代码。个人有点执着就是自己懂的东西都不去用别人的,就硬着头皮写下了。

3、oauth_nonce:应该说一开始也是自己知识的限制,都不知道oauth_nonce的作用,而且还针对其长度新浪和腾讯不一发问,呵呵。其实,oauth_nonce就是一个随机字符串,用于防止重复攻击,长度没有明确的规定,常取32位。

4、signature:签名还是第一次接触,只能看别人的代码了,不过看了也看不出所以然来,就那几句,直接copy了。

5、base64encode:和签名相关的,也没时间去弄,此处均参考网上公开代码。

6、以上基本的东西都准备好了,就开始联网了。使用httpurlconnecton 还是httpclient,就看个人习惯了。腾讯给出的sdk采用httpclient,但是版本与andorid本身的httpclient版本不一致,所以需要导入httpclient包,本人嫌包太大(本来主程序代码总共就那么几十K,还要导入个上百K的外部包,感觉就不爽),就没有用。自己搞弄了一些时间,弄出了现在的代码。

7、中文乱码:中途测试可以发送英文字母,中文却乱码。后经高人指点,是因为我的项目是GBK而不是UTF-8,且代码编码有点乱。这只能是我自己的错了。

8、手机联网:WIFI可以直接连接互联网,手机的(E)GPRS必须经过代理。

BaseString类代码

import java.net.URLEncoder;
import java.util.ArrayList;
 
/**
 *
 * @author mrlixirong
 *
 * 2011-11-16
 */
public class BaseString {
     
    String url;//请求网址
    String httpMethod;//请求方式
    ArrayList<String> paramNameList;//参数名列表
    ArrayList<String> paramValueList;//参数值列表
    int[] order;//参数名排序
     
    public BaseString(){
        paramNameList=new ArrayList<String>();
        paramValueList=new ArrayList<String>();
        url=null;
        httpMethod=null;
    }
     
    //设置请求网址
    public void setURL(String url){
        this.url=url;
    }
     
    //设置请求方式
    public void setHttpMethod(String httpMethod){
        this.httpMethod=httpMethod;
    }
     
    //添加参数
    public void addParams(String name,String value){
        paramNameList.add(name);
        paramValueList.add(value);
    }
     
    //获取baseString
    public String getBaseString(){
        StringBuffer sb=new StringBuffer();
        try {
            sb.append(httpMethod);
            sb.append("&");
            sb.append(URLEncoder.encode(url, "UTF-8"));
            sb.append("&");
            order();
            int size=paramNameList.size();
            for(int i=0;i<size;i++){
                sb.append(paramNameList.get(order[i]));
                sb.append("%3D");
                sb.append(URLEncoder.encode(paramValueList.get(order[i]),"UTF-8"));
                if(i<size-1){
                    sb.append("%26");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
     
    //根据参数名排序
    void order(){
        int size=paramNameList.size();
        order=new int[size];
        String name1;
        String name2;
        for(int i=0;i<size;i++){
            name1=paramNameList.get(i);
            int k=0;
            for(int j=0;j<size;j++){
                name2=paramNameList.get(j);
                if(name1.compareTo(name2)>0){
                    k++;
                }
            }
            order[k]=i;
        }
    }
     
}

原文链接: http://blog.csdn.net/mrlixirong/article/details/6979528
加载中
返回顶部
顶部