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