Android仿人人客户端(v5.7.1)——通过HTTPS协议的POST方式获取用户的基本信息

来源:互联网 发布:知网查重 知乎 编辑:程序博客网 时间:2024/05/29 14:11

转载请标明出处:http://blog.csdn.net/android_ls/article/details/8770537

一、扩展之前的网络模块

      基于Android仿人人客户端(v5.7.1)——网络模块处理的架构这篇进行扩展,添加通过HTTPS协议的POST方式访问网络的处理。自定义类(AsyncHttpsPost)让其继承AsyncBaseRequest类,代码如下:

package com.everyone.android.net;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.HTTP;import com.everyone.android.callback.ParseCallback;import com.everyone.android.callback.ResultCallback;/** * 功能描述:通过HTTPS协议发送POST网络请求 * @author android_ls * */public class AsyncHttpsPost extends AsyncBaseRequest {/** *  */private static final long serialVersionUID = 4L;public AsyncHttpsPost(String url, Map<String, String> parameter,ParseCallback handler, ResultCallback requestCallback) {super(url, parameter, handler, requestCallback);}@Overrideprotected InputStream getRequestResult() throws IOException {    List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();        if(parameter != null && !parameter.isEmpty()){            for(Map.Entry<String, String> entry : parameter.entrySet()){                paramPairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));            }        }                UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, HTTP.UTF_8);        HttpPost post = new HttpPost(requestUrl);        post.setEntity(entitydata);        DefaultHttpClient client = new DefaultHttpClient();         // 执行POST方式请求        HttpResponse response = client.execute(post);        if(response.getStatusLine().getStatusCode()==200){            return response.getEntity().getContent();        }        return null;}}

二、获取用户的基本信息

       向服务器端发送请求,获取用户的基本信息。注:为什么要使用HTTPS协议发送请求?官方给出的理由,使用HTTPS协议调用API接口可以免去SIG认证。(人人开放平台的API:http://wiki.dev.renren.com/wiki/API)
         1、获取用户信息所需的参数

        String url = "https://api.renren.com/restserver.do";        Map<String, String> parameter = new HashMap<String, String>();        parameter.put("v", "1.0"); // API的版本号,固定值为1.0         parameter.put("access_token", accessToken); // OAuth2.0验证授权后获得的token。        parameter.put("format", "JSON"); // 返回值的格式。请指定为JSON或者XML,推荐使用JSON,缺省值为XML         parameter.put("call_id", "1.0"); // 请求队列号         parameter.put("method", "users.getInfo"); // 你要访问那个接口,我们肯定调用获取用户的信息的接口咯,该接口支持批量获取。

       注:AccessToken的值我们之前有在本地存储的,获取的方式如下:

        mAuthTokenManager = new AuthTokenManager(this);        String accessToken = mAuthTokenManager.getAccessToken();        LogUtil.e("EveryoneActivity", "accessToken = " + accessToken);


       2、发送异步网络请求 

        AsyncBaseRequest asyncHttpsPost = new AsyncHttpsPost(url, parameter, new ParseCallback() {                        @Override            public Object parse(String json) throws JSONException {                LogUtil.i("EveryoneActivity", "json = " + json);                                return null;            }        }, new ResultCallback() {                        @Override            public void onSuccess(Object obj) {                          }                        @Override            public void onFail(int errorCode) {                // TODO Auto-generated method stub            }        });                mDefaultThreadPool.execute(asyncHttpsPost);        mAsyncRequests.add(asyncHttpsPost);

       3、网络请求返回的JSON

        [             {                 "uid":461345584,                 "tinyurl":"http://hdn.xnimg.cn/photos/hdn521/20130319/1930/h_tiny_zggz_8829000002e6113e.jpg",                 "vip":1,                 "sex":1,                 "name":"逐鹿。。。",                 "star":1,                 "headurl":"http://hdn.xnimg.cn/photos/hdn521/20130319/1930/h_head_jbdD_8829000002e6113e.jpg",                 "zidou":0             }        ]


       4、对JSON进行解析(这里我们要自己一个字段一个字段的去解吗?不用,我给大家推荐使用谷歌GSON去进行解析。不知道的可以到网上搜下GSON,下载一个jar包导入工程就可以了。)

          new ParseCallback() {                        @Override            public Object parse(String json) throws JSONException {                LogUtil.i("EveryoneActivity", "json = " + json);                                Gson gson = new Gson();                java.lang.reflect.Type type = new TypeToken<LinkedList<UserBasicInfo>>(){}.getType();                LinkedList<UserBasicInfo> userList = gson.fromJson(json, type);                return userList.get(0);            }          }

       5、将解析后的结果返回

        new ResultCallback() {                        @Override            public void onSuccess(Object obj) {                UserBasicInfo userBasic = (UserBasicInfo)obj;                LogUtil.i("EveryoneActivity", "userBasic = " + userBasic.toString());                            }                        @Override            public void onFail(int errorCode) {                // TODO Auto-generated method stub            }        }

三、发送网络请求,并解析返回结果的完整代码如下:

        mAuthTokenManager = new AuthTokenManager(this);        String accessToken = mAuthTokenManager.getAccessToken();        LogUtil.e("EveryoneActivity", "accessToken = " + accessToken);        // 获取用户信息所需的参数        String url = "https://api.renren.com/restserver.do";        Map<String, String> parameter = new HashMap<String, String>();        parameter.put("v", "1.0"); // API的版本号,固定值为1.0         parameter.put("access_token", accessToken); // OAuth2.0验证授权后获得的token。        parameter.put("format", "JSON"); // 返回值的格式。请指定为JSON或者XML,推荐使用JSON,缺省值为XML         parameter.put("call_id", "1.0"); // 请求队列号         parameter.put("method", "users.getInfo"); // 你要访问那个接口,我们肯定调用用获取用户的信息的接口咯,该接口支持批量获取。        AsyncBaseRequest asyncHttpsPost = new AsyncHttpsPost(url, parameter, new ParseCallback() {            @Override            public Object parse(String json) throws JSONException {                LogUtil.i("EveryoneActivity", "json = " + json);                Gson gson = new Gson();                java.lang.reflect.Type type = new TypeToken<LinkedList<UserBasicInfo>>() {                }.getType();                LinkedList<UserBasicInfo> userList = gson.fromJson(json, type);                return userList.get(0);            }        }, new ResultCallback() {            @Override            public void onSuccess(Object obj) {                UserBasicInfo userBasic = (UserBasicInfo) obj;                LogUtil.i("EveryoneActivity", "userBasic = " + userBasic.toString());            }            @Override            public void onFail(int errorCode) {                // TODO Auto-generated method stub            }        });        mDefaultThreadPool.execute(asyncHttpsPost);        mAsyncRequests.add(asyncHttpsPost);

     附带:用户基本信息实体类

package com.everyone.android.entity;/** * 功能描述:用户基本信息实体类 * @author android_ls * */public class UserBasicInfo {    private int uid; // 用户id     private String tinyurl; // 头像链接 50*50大小     private int sex; // 性别,值1表示男性;值0表示女性     private String name; // 用户名     private int star; // 是否为星级用户,值“1”表示“是”;值“0”表示“不是”     private String headurl; // 头像链接 100*100大小     private int zidou; // 是否为vip用户,值1表示是;值0表示不是     private int vip; // 是否为vip用户等级,前提是zidou节点必须为1     public int getUid() {        return uid;    }    public void setUid(int uid) {        this.uid = uid;    }    public String getTinyurl() {        return tinyurl;    }    public void setTinyurl(String tinyurl) {        this.tinyurl = tinyurl;    }    public int getSex() {        return sex;    }    public void setSex(int sex) {        this.sex = sex;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getStar() {        return star;    }    public void setStar(int star) {        this.star = star;    }    public String getHeadurl() {        return headurl;    }    public void setHeadurl(String headurl) {        this.headurl = headurl;    }    public int getZidou() {        return zidou;    }    public void setZidou(int zidou) {        this.zidou = zidou;    }    public int getVip() {        return vip;    }    public void setVip(int vip) {        this.vip = vip;    }    @Override    public String toString() {        return "UserBasicInfo [uid=" + uid + ", tinyurl=" + tinyurl + ", sex=" + sex + ", name=" + name + ", star=" + star + ", headurl="                + headurl + ", zidou=" + zidou + ", vip=" + vip + "]";    }}

       这篇就先聊到这里,上面获取的用户信息里,有用户图像的URL,也就是说关联到了图片在本地的存储与处理。下一篇我们聊一聊图片的双缓存处理,敬请期待。。。

原创粉丝点击