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.youkuaiyun.com,"UTF-8">http://www.youkuaiyun.com,"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必须经过代理。
项目源代码:http://download.youkuaiyun.com/detail/mrlixirong/3804385
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;
}
}
}