灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3170回复:0

Android----http请求工具类

楼主#
更多 发布于:2012-09-06 14:06


项目中客户端与服务器端采用http请求进行交互,在这里我把http请求的工具类贴出来。
该工具类采用的是HttpClients框架,HTTP保存方式有两种选择 :一种:整个应用 只创建 一个HttpClient对象,然后保存在整个程序中去。此情况无法创建多线程中应用。
另一种:随时创建HttpClient对象。系统自动保存Session就行。此情况可能对系统资源消耗利害
用完之后请随时销毁HttpClient,避免系统中存在很多HttpClient对象。在这里我采用的是第二种。
包含两个java文件,第一个是主要的请求工具类文件,第二个主要是保存请求的session,下面见代码:
[cpp]
package com.hlj.padtwo.util.util_public.httputil;



import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.net.ssl.SSLHandshakeException;

import org.apache.http.Header;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

import Android.app.Activity;
import Android.content.Context;
import Android.widget.Toast;

import com.hlj.padtwo.util.application.MyApplication;


/***
* Http通信中的POST和GET请求方式的不同。GET把参数放在URL字符串后面,传递给服务器
* 而POST方法的参数是放在Http请求中,主要用于手机对Http访问提供公共的访问类对象。
* @author hlj
* @date
* @versionn 1.0
**/
public class HttpClients {
    /** 执行downfile后,得到下载文件的大小 */
    private long contentLength;
    /** 返回连接失败信息 **/
    private String strResult = "服务器无法连接,请检查网络";

    /** http 请求头参数 **/
    private HttpParams httpParams;
    /** httpClient 对象 **/
    private DefaultHttpClient httpClient;


    /** 得到上下文 **/
    private Context context;
    private Activity activity = null;

    public HttpClients(Activity act) {
        this.context = act.getBaseContext();
        this.activity = act;
        getHttpClient();
    }

    /**
     * 提供GET形式的访问网络请求 doGet 参数示例: Map params=new HashMap();
     * params.put("usename","helijun"); params.put("password","123456");
     * httpClient.doGet(url,params);
     *
     * @param url
     *            请求地址
     * @param params
     *            请求参数
     * @return 返回 String jsonResult;
     *
     * **/
    @SuppressWarnings("unchecked")
    public String doGet(String url, Map params) {
        /** 建立HTTPGet对象 **/
        String paramStr = "";
        if (params == null)
            params = new HashMap();
        /** 迭代请求参数集合 **/
        Iterator iter = params.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            Object key = entry.getKey();
            String val = nullToString(entry.getValue());
            paramStr += paramStr = ";" + key + "=" + URLEncoder.encode(val);
        }
        if (!paramStr.equals("")) {
            paramStr = paramStr.replaceFirst(";", "?");
            url += paramStr;
        }
        return doGet(url);
    }

    /**
     * 提供GET形式的访问网络请求 doGet 参数示例: Map params=new HashMap();
     * params.put("usename","gongshuanglin"); params.put("password","123456");
     * httpClient.doGet(url,params);
     *
     * @param url
     *            请求地址
     * @param params
     *            请求参数
     * @return 返回 String jsonResult;
     *
     */
    public String doGet(String url, List<NameValuePair> params) {
        /** 建立HTTPGet对象 **/
        String paramStr = "";
        if (params == null)
            params = new ArrayList<NameValuePair>();
        /** 迭代请求参数集合 **/

        for (NameValuePair obj : params) {
            paramStr += paramStr = ";" + obj.getName() + "="
                    + URLEncoder.encode(obj.getValue());
        }
        if (!paramStr.equals("")) {
            paramStr = paramStr.replaceFirst(";", "?");
            url += paramStr;
        }
        return doGet(url);
    }

    /**
     * 提供GET形式的访问网络请求 doGet 参数示例:
     *
     * @param url
     *            请求地址
     * @return 返回 String jsonResult;
     *
     */
    public String doGet(String url) {
        /** 创建HttpGet对象 **/
        HttpGet httpRequest = new HttpGet(url);
        httpRequest.setHeaders(this.getHeader());
        try {
            /** 保持会话Session **/
            /** 设置Cookie **/
            MyHttpCookies li = new MyHttpCookies(context);
            CookieStore cs = li.getuCookie();
            /** 第一次请求App保存的Cookie为空,所以什么也不做,只有当APP的Cookie不为空的时。把请请求的Cooke放进去 **/
            if (cs != null) {
                httpClient.setCookieStore(li.getuCookie());
            }

            /** 保持会话Session end **/

            /* 发送请求并等待响应 */
            HttpResponse httpResponse = httpClient.execute(httpRequest);
            /* 若状态码为200 ok */
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                /* 读返回数据 */
                strResult = EntityUtils.toString(httpResponse.getEntity());

                /** 执行成功之后得到 **/
                /** 成功之后把返回成功的Cookis保存APP中 **/
                // 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis
                li.setuCookie(httpClient.getCookieStore());

            } else {
                strResult = "Error Response: "
                        + httpResponse.getStatusLine().toString();
            }
        } catch (ClientProtocolException e) {
            strResult = nullToString(e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            strResult = nullToString(e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            strResult = nullToString(e.getMessage());
            e.printStackTrace();
        } finally {
            httpRequest.abort();
            this.shutDownClient();
        }
        return strResult;
    }

    /**
     * 提供Post形式的访问网络请求 Post 参数示例: doPost 参数示例 List<NameValuePair> paramlist =
     * new ArrayList<NameValuePair>(); paramlist(new BasicNameValuePair("email",
     * "xxx@123.com")); paramlist(new BasicNameValuePair("address", "123abc"));
     * httpClient.doPost(url,paramlist);
     *
     * @param url
     *            请求地址
     * @param params
     *            请求参数
     * @return 返回 String jsonResult;
     * **/

    public String doPost(String url, List<NameValuePair> params) {
        /* 建立HTTPPost对象 */

        HttpPost httpRequest = new HttpPost(url);
        // 设置请求Header信息、
        httpRequest.setHeaders(this.getHeader());
        try {
            /** 添加请求参数到请求对象 */
//          boolean upFileFlag = false;// 是否有文件上传
//          MultipartEntity mpEntity = new MultipartEntity(
//                  HttpMultipartMode.BROWSER_COMPATIBLE);
//          for (NameValuePair param : params) {
//              ContentBody contentBody = null;
//              File file = new File(param.getValue());
//              if (file.isFile()) {
//                  contentBody = new FileBody(file);
//                  upFileFlag = true;
//              } else {
//                  contentBody = new StringBody(param.getValue(), Charset
//                          .forName(HTTP.UTF_8));
//              }
//              mpEntity.addPart(param.getName(), contentBody);
//          }
//
//          if (upFileFlag == true) {// 文件 上传
//              httpRequest.setEntity(mpEntity);
//          } else {
                /** 添加请求参数到请求对象 */
                httpRequest.setEntity(new UrlEncodedFormEntity(params,
                        HTTP.UTF_8));
//          }

            /** 保持会话Session **/
            /** 设置Cookie **/
                MyHttpCookies li = new MyHttpCookies(context);
            CookieStore cs = li.getuCookie();
            /** 第一次请求App保存的Cookie为空,所以什么也不做,只有当APP的Cookie不为空的时。把请请求的Cooke放进去 **/
            if (cs != null) {
                httpClient.setCookieStore(li.getuCookie());
            }

            /** 保持会话Session end **/

            /** 发送请求并等待响应 */

            HttpResponse httpResponse = httpClient.execute(httpRequest);
            
            /** 若状态码为200 ok */
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                /* 读返回数据 */
                strResult = EntityUtils.toString(httpResponse.getEntity());

                /** 执行成功之后得到 **/
                /** 成功之后把返回成功的Cookis保存APP中 **/
                // 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis
                li.setuCookie(httpClient.getCookieStore());

                /** 设置Cookie end **/
            } else {
                strResult = "Error Response: "
                        + httpResponse.getStatusLine().toString();
            }
        } catch (ClientProtocolException e) {
            strResult = "";
//          strResult = e.getMessage().toString();
            e.printStackTrace();
        } catch (IOException e) {
            strResult = "";
//          strResult = e.getMessage().toString();
            e.printStackTrace();
        } catch (Exception e) {
            strResult = "";
//          strResult = e.getMessage().toString();
            e.printStackTrace();
        } finally {
            httpRequest.abort();
            this.shutDownClient();
        }
        return strResult;
    }

    /** 得到 apache http HttpClient对象 **/
    public DefaultHttpClient getHttpClient() {

        /** 创建 HttpParams 以用来设置 HTTP 参数 **/

        httpParams = new BasicHttpParams();

        /** 设置连接超时和 Socket 超时,以及 Socket 缓存大小 **/

        HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);

        HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);

        HttpConnectionParams.setSocketBufferSize(httpParams, 8192);

        HttpClientParams.setRedirecting(httpParams, true);

        /**
         * 创建一个 HttpClient 实例 //增加自动选择网络,自适应cmwap、CMNET、wifi或3G
         */
        MyHttpCookies li = new MyHttpCookies(context);
        String proxyStr = li.getHttpProxyStr();
        if (proxyStr != null ;; proxyStr.trim().length() > 0) {
            HttpHost proxy = new HttpHost(proxyStr, 80);
            httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY,
                    proxy);
        }
        /** 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient **/

        httpClient = new DefaultHttpClient(httpParams);
        httpClient.setHttpRequestRetryHandler(requestRetryHandler);
        
        return httpClient;

    }

    /** 得到设备信息、系统版本、驱动类型 **/
    private Header[] getHeader() {
        /** 请求头信息 end **/
        MyHttpCookies li = new MyHttpCookies(context);
        return li.getHttpHeader();
    }

    /** 销毁HTTPCLient **/
    public void shutDownClient() {
        httpClient.getConnectionManager().shutdown();
    }

//  /**
//   * 提供GET形式的访问网络请求 doGet 参数示例:
//   *  
//   * @param url
//   *            请求地址
//   * @return 返回 String jsonResult;
//   *  
//   */
//  public InputStream doDownFile(String url) {
//      /** 创建HttpGet对象 **/
//      HttpGet httpRequest = new HttpGet(url);
//      httpRequest.setHeaders(this.getHeader());
//      try {
//          /** 保持会话Session **/
//          /** 设置Cookie **/
//          MyHttpCookies li = new MyHttpCookies(context);
//          CookieStore cs = li.getuCookie();
//          /** 第一次请求App保存的Cookie为空,所以什么也不做,只有当APP的Cookie不为空的时。把请请求的Cooke放进去 **/
//          if (cs != null) {
//              httpClient.setCookieStore(li.getuCookie());
//          }
//          /** 保持会话Session end **/
//          /* 发送请求并等待响应 */
//          HttpResponse httpResponse = httpClient.execute(httpRequest);
//          /* 若状态码为200 ok */
//          if (httpResponse.getStatusLine().getStatusCode() == 200) {
//              /** 执行成功之后得到 **/
//              /** 成功之后把返回成功的Cookis保存APP中 **/
//              // 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis
//              li.setuCookie(httpClient.getCookieStore());
//              this.contentLength = httpResponse.getEntity()
//                      .getContentLength();
//              /* 读返回数据 */
//              return httpResponse.getEntity().getContent();
//          } else {
//              strResult = "Error Response: "
//                      + httpResponse.getStatusLine().toString();
//          }
//      } catch (ClientProtocolException e) {
//          strResult = e.getMessage().toString();
//          e.printStackTrace();
//      } catch (IOException e) {
//          strResult = e.getMessage().toString();
//          e.printStackTrace();
//      } catch (Exception e) {
//          strResult = e.getMessage().toString();
//          e.printStackTrace();
//      } finally {
//          // httpRequest.abort();
//          // this.shutDownClient();
//      }
//      this.contentLength = 0;
//      return null;
//  }

    /**
     * 异常自动恢复处理, 使用HttpRequestRetryHandler接口实现请求的异常恢复
     */
    private static HttpRequestRetryHandler requestRetryHandler = new HttpRequestRetryHandler() {
        // 自定义的恢复策略
        public boolean retryRequest(IOException exception, int executionCount,
                HttpContext context) {
            // 设置恢复策略,在发生异常时候将自动重试N次
            if (executionCount >= 3) {
                // 如果超过最大重试次数,那么就不要继续了
                return false;
            }
            if (exception instanceof NoHttpResponseException) {
                // 如果服务器丢掉了连接,那么就重试
                return true;
            }
            if (exception instanceof SSLHandshakeException) {
                // 不要重试SSL握手异常
                return false;
            }
            HttpRequest request = (HttpRequest) context
                    .getAttribute(ExecutionContext.HTTP_REQUEST);
            boolean idempotent = (request instanceof HttpEntityEnclosingRequest);
            if (!idempotent) {
                // 如果请求被认为是幂等的,那么就重试
                return true;
            }
            return false;
        }
    };

    public long getContentLength() {
        return contentLength;
    }

    /**
     * 假如obj对象 是null返回""
     * @param obj
     * @return
     */
    public static String nullToString(Object obj){
        if(obj==null){
            return "";
        }
        return obj.toString();
    }
}

[cpp]
package com.hlj.padtwo.util.util_public.httputil;



import org.apache.http.Header;
import org.apache.http.client.CookieStore;
import org.apache.http.message.BasicHeader;

import Android.content.Context;
import Android.database.Cursor;
import Android.net.Uri;
import Android.net.wifi.WifiManager;

/**
* http请求的缓存和一些公用的参数
* @author helijun
*
*/
public class MyHttpCookies {
    /** 每页数据显示最大数 */
    private static int pageSize = 10;
    /** 当前会话后的cokie信息 */
    private static CookieStore uCookie = null;
    /** 公用的HTTP提示头信息 */
    private static Header[] httpHeader;
    /** HTTP连接的网络节点 */
    private static String httpProxyStr;
    /**http请求的公用url部分**/
    public static String baseurl = "http://www.atcpu.com /River";
    /**上下文对象**/
    Context context;
    
    public MyHttpCookies(Context context){
        this.context = context;
        /** y设置请求头 **/
        /** y设置请求头 **/
        Header[] header = {
                new BasicHeader("PagingRows", String.valueOf(pageSize)) };
        httpHeader = header;
    }
    
    /**
     * 增加自动选择网络,自适应cmwap、CMNET、wifi或3G
     */
    @SuppressWarnings("static-access")
    public void initHTTPProxy() {
        WifiManager wifiManager = (WifiManager) (context.getSystemService(context.WIFI_SERVICE));
        if (!wifiManager.isWifiEnabled()) {
            Uri uri = Uri.parse("content://telephony/carriers/preferapn"); // 获取当前正在使用的APN接入点
            Cursor mCursor =context. getContentResolver().query(uri, null, null, null,
                    null);
            if (mCursor != null) {
                mCursor.moveToNext(); // 游标移至第一条记录,当然也只有一条
                httpProxyStr = mCursor.getString(mCursor
                        .getColumnIndex("proxy"));
            }
        } else {
            httpProxyStr = null;
        }
    }
    
    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public CookieStore getuCookie() {
        return uCookie;
    }

    public void setuCookie(CookieStore uCookie) {
        this.uCookie = uCookie;
    }


    public Header[] getHttpHeader() {
        return httpHeader;
    }

    public String getHttpProxyStr() {
        return httpProxyStr;
    }
}
作者:RiverAM

喜欢0 评分0
游客

返回顶部