Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 實戰Android仿人人客戶端之通過HTTPS協議的POST方式獲取用戶的基本信息

實戰Android仿人人客戶端之通過HTTPS協議的POST方式獲取用戶的基本信息

編輯:Android開發實例

一、擴展之前的網絡模塊

      基於 實戰Android仿人人客戶端之網絡模塊處理的架構 這篇進行擴展,添加通過HTTPS協議的POST方式訪問網絡的處理。自定義類(AsyncHttpsPost)讓其繼承AsyncBaseRequest類,代碼如下:

  1. package com.everyone.android.net;  
  2.  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.  
  9. import org.apache.http.HttpResponse;  
  10. import org.apache.http.NameValuePair;  
  11. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  12. import org.apache.http.client.methods.HttpPost;  
  13. import org.apache.http.impl.client.DefaultHttpClient;  
  14. import org.apache.http.message.BasicNameValuePair;  
  15. import org.apache.http.protocol.HTTP;  
  16.  
  17. import com.everyone.android.callback.ParseCallback;  
  18. import com.everyone.android.callback.ResultCallback;  
  19.  
  20. /**  
  21.  * 功能描述:通過HTTPS協議發送POST網絡請求  
  22.  * @author android_ls  
  23.  *  
  24.  */ 
  25. public class AsyncHttpsPost extends AsyncBaseRequest {  
  26.  
  27.     /**  
  28.      *   
  29.      */ 
  30.     private static final long serialVersionUID = 4L;  
  31.  
  32.     public AsyncHttpsPost(String url, Map<String, String> parameter,  
  33.             ParseCallback handler, ResultCallback requestCallback) {  
  34.         super(url, parameter, handler, requestCallback);  
  35.     }  
  36.  
  37.     @Override 
  38.     protected InputStream getRequestResult() throws IOException {  
  39.         List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();  
  40.         if(parameter != null && !parameter.isEmpty()){  
  41.             for(Map.Entry<String, String> entry : parameter.entrySet()){  
  42.                 paramPairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));  
  43.             }  
  44.         }  
  45.           
  46.         UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, HTTP.UTF_8);  
  47.         HttpPost post = new HttpPost(requestUrl);  
  48.         post.setEntity(entitydata);  
  49.         DefaultHttpClient client = new DefaultHttpClient();   
  50.         // 執行POST方式請求  
  51.         HttpResponse response = client.execute(post);  
  52.         if(response.getStatusLine().getStatusCode()==200){  
  53.             return response.getEntity().getContent();  
  54.         }  
  55.           
  56.         return null;  
  57.     }  
  58.  
  59. }  
  60.  

二、獲取用戶的基本信息

       向服務器端發送請求,獲取用戶的基本信息。注:為什麼要使用HTTPS協議發送請求?官方給出的理由,使用HTTPS協議調用API接口可以免去SIG認證。(人人開放平台的API:http://wiki.dev.renren.com/wiki/API)
         1、獲取用戶信息所需的參數

  1. String url = "https://api.renren.com/restserver.do";  
  2. Map<String, String> parameter = new HashMap<String, String>();  
  3. parameter.put("v", "1.0"); // API的版本號,固定值為1.0   
  4. parameter.put("access_token", accessToken); // OAuth2.0驗證授權後獲得的token。  
  5. parameter.put("format", "JSON"); // 返回值的格式。請指定為JSON或者XML,推薦使用JSON,缺省值為XML   
  6. parameter.put("call_id", "1.0"); // 請求隊列號   
  7. parameter.put("method", "users.getInfo"); // 你要訪問那個接口,我們肯定調用獲取用戶的信息的接口咯,該接口支持批量獲取。  

       注:AccessToken的值我們之前有在本地存儲的,獲取的方式如下:

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


       2、發送異步網絡請求 

  1. AsyncBaseRequest asyncHttpsPost = new AsyncHttpsPost(url, parameter, new ParseCallback() {  
  2.       
  3.     @Override 
  4.     public Object parse(String json) throws JSONException {  
  5.         LogUtil.i("EveryoneActivity", "json = " + json);  
  6.           
  7.         return null;  
  8.     }  
  9. }, new ResultCallback() {  
  10.       
  11.     @Override 
  12.     public void onSuccess(Object obj) {  
  13.         
  14.     }  
  15.       
  16.     @Override 
  17.     public void onFail(int errorCode) {  
  18.         // TODO Auto-generated method stub  
  19.     }  
  20. });  
  21.  
  22. mDefaultThreadPool.execute(asyncHttpsPost);  
  23. mAsyncRequests.add(asyncHttpsPost);  

       3、網絡請求返回的JSON

  1. [  
  2.      {  
  3.          "uid":461345584,  
  4.          "tinyurl":"http://hdn.xnimg.cn/photos/hdn521/20130319/1930/h_tiny_zggz_8829000002e6113e.jpg",  
  5.          "vip":1,  
  6.          "sex":1,  
  7.          "name":"逐鹿。。。",  
  8.          "star":1,  
  9.          "headurl":"http://hdn.xnimg.cn/photos/hdn521/20130319/1930/h_head_jbdD_8829000002e6113e.jpg",  
  10.          "zidou":0  
  11.      }  
  12. ]  


       4、對JSON進行解析(這裡我們要自己一個字段一個字段的去解嗎?不用,我給大家推薦使用谷歌GSON去進行解析。不知道的可以到網上搜下GSON,下載一個jar包導入工程就可以了。)

  1. new ParseCallback() {  
  2.     
  3.   @Override 
  4.   public Object parse(String json) throws JSONException {  
  5.       LogUtil.i("EveryoneActivity", "json = " + json);  
  6.         
  7.       Gson gson = new Gson();  
  8.       java.lang.reflect.Type type = new TypeToken<LinkedList<UserBasicInfo>>(){}.getType();  
  9.       LinkedList<UserBasicInfo> userList = gson.fromJson(json, type);  
  10.       return userList.get(0);  
  11.   }  
  12. }  

       5、將解析後的結果返回

  1. new ResultCallback() {  
  2.       
  3.     @Override 
  4.     public void onSuccess(Object obj) {  
  5.         UserBasicInfo userBasic = (UserBasicInfo)obj;  
  6.         LogUtil.i("EveryoneActivity", "userBasic = " + userBasic.toString());  
  7.           
  8.     }  
  9.       
  10.     @Override 
  11.     public void onFail(int errorCode) {  
  12.         // TODO Auto-generated method stub  
  13.     }  
  14. }  

三、發送網絡請求,並解析返回結果的完整代碼如下:

  1. mAuthTokenManager = new AuthTokenManager(this);  
  2. String accessToken = mAuthTokenManager.getAccessToken();  
  3. LogUtil.e("EveryoneActivity", "accessToken = " + accessToken);  
  4.  
  5. // 獲取用戶信息所需的參數  
  6. String url = "https://api.renren.com/restserver.do";  
  7. Map<String, String> parameter = new HashMap<String, String>();  
  8. parameter.put("v", "1.0"); // API的版本號,固定值為1.0   
  9. parameter.put("access_token", accessToken); // OAuth2.0驗證授權後獲得的token。  
  10. parameter.put("format", "JSON"); // 返回值的格式。請指定為JSON或者XML,推薦使用JSON,缺省值為XML   
  11. parameter.put("call_id", "1.0"); // 請求隊列號   
  12. parameter.put("method", "users.getInfo"); // 你要訪問那個接口,我們肯定調用用獲取用戶的信息的接口咯,該接口支持批量獲取。  
  13.  
  14. AsyncBaseRequest asyncHttpsPost = new AsyncHttpsPost(url, parameter, new ParseCallback() {  
  15.  
  16.     @Override 
  17.     public Object parse(String json) throws JSONException {  
  18.         LogUtil.i("EveryoneActivity", "json = " + json);  
  19.  
  20.         Gson gson = new Gson();  
  21.         java.lang.reflect.Type type = new TypeToken<LinkedList<UserBasicInfo>>() {  
  22.         }.getType();  
  23.         LinkedList<UserBasicInfo> userList = gson.fromJson(json, type);  
  24.         return userList.get(0);  
  25.     }  
  26. }, new ResultCallback() {  
  27.  
  28.     @Override 
  29.     public void onSuccess(Object obj) {  
  30.         UserBasicInfo userBasic = (UserBasicInfo) obj;  
  31.         LogUtil.i("EveryoneActivity", "userBasic = " + userBasic.toString());  
  32.  
  33.     }  
  34.  
  35.     @Override 
  36.     public void onFail(int errorCode) {  
  37.         // TODO Auto-generated method stub  
  38.     }  
  39. });  
  40.  
  41. mDefaultThreadPool.execute(asyncHttpsPost);  
  42. mAsyncRequests.add(asyncHttpsPost);  

     附帶:用戶基本信息實體類

  1. package com.everyone.android.entity;  
  2.  
  3. /**  
  4.  * 功能描述:用戶基本信息實體類  
  5.  * @author android_ls  
  6.  *  
  7.  */ 
  8. public class UserBasicInfo {  
  9.  
  10.     private int uid; // 用戶id   
  11.  
  12.     private String tinyurl; // 頭像鏈接 50*50大小   
  13.  
  14.     private int sex; // 性別,值1表示男性;值0表示女性   
  15.  
  16.     private String name; // 用戶名   
  17.  
  18.     private int star; // 是否為星級用戶,值“1”表示“是”;值“0”表示“不是”   
  19.  
  20.     private String headurl; // 頭像鏈接 100*100大小   
  21.  
  22.     private int zidou; // 是否為vip用戶,值1表示是;值0表示不是   
  23.  
  24.     private int vip; // 是否為vip用戶等級,前提是zidou節點必須為1   
  25.  
  26.     public int getUid() {  
  27.         return uid;  
  28.     }  
  29.  
  30.     public void setUid(int uid) {  
  31.         this.uid = uid;  
  32.     }  
  33.  
  34.     public String getTinyurl() {  
  35.         return tinyurl;  
  36.     }  
  37.  
  38.     public void setTinyurl(String tinyurl) {  
  39.         this.tinyurl = tinyurl;  
  40.     }  
  41.  
  42.     public int getSex() {  
  43.         return sex;  
  44.     }  
  45.  
  46.     public void setSex(int sex) {  
  47.         this.sex = sex;  
  48.     }  
  49.  
  50.     public String getName() {  
  51.         return name;  
  52.     }  
  53.  
  54.     public void setName(String name) {  
  55.         this.name = name;  
  56.     }  
  57.  
  58.     public int getStar() {  
  59.         return star;  
  60.     }  
  61.  
  62.     public void setStar(int star) {  
  63.         this.star = star;  
  64.     }  
  65.  
  66.     public String getHeadurl() {  
  67.         return headurl;  
  68.     }  
  69.  
  70.     public void setHeadurl(String headurl) {  
  71.         this.headurl = headurl;  
  72.     }  
  73.  
  74.     public int getZidou() {  
  75.         return zidou;  
  76.     }  
  77.  
  78.     public void setZidou(int zidou) {  
  79.         this.zidou = zidou;  
  80.     }  
  81.  
  82.     public int getVip() {  
  83.         return vip;  
  84.     }  
  85.  
  86.     public void setVip(int vip) {  
  87.         this.vip = vip;  
  88.     }  
  89.  
  90.     @Override 
  91.     public String toString() {  
  92.         return "UserBasicInfo [uid=" + uid + ", tinyurl=" + tinyurl + ", sex=" + sex + ", name=" + name + ", star=" + star + ", headurl=" 
  93.                 + headurl + ", zidou=" + zidou + ", vip=" + vip + "]";  
  94.     }  
  95.  
  96. }  

       這篇就先聊到這裡,上面獲取的用戶信息裡,有用戶圖像的URL,也就是說關聯到了圖片在本地的存儲與處理。下一篇我們聊一聊圖片的雙緩存處理,敬請期待。。。

轉自:http://blog.csdn.net/android_ls/article/details/8770537

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved