项目中客户端与
服务器端采用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("pass
word","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("pass
word","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.at
cpu.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