package com.gary.dialpermmit;
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 java.io.InputStreamReader;
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 android.os.StrictMode;
import android.util.Log;
/***
* Http通信中的POST和GET请求方式的不同。GET把参数放在URL字符串后面,传递给服务器。
* 而POST方法的参数是放在Http请求中,主要用于手机对Http访问提供公共的访问类对象。
* @author hlj
* @date
* @versionn 1.0
**/
public class DialPermmitHttpClient {
private static final String TAG = "DialPermmit.DialPermmitHttpClient";
/** 执行downfile后,得到下载文件的大小 */
private long contentLength;
/** 返回连接失败信息 **/
private String strResult = "服务器无法连接,请检查网络";
/** http 请求头参数 **/
private HttpParams httpParams;
/** httpClient 对象 **/
private DefaultHttpClient httpClient;
/** 得到上下文 **/
private Context context;
public DialPermmitHttpClient(Context cont) {
this.context = cont;//act.getBaseContext();
//getHttpClient();//cbk.dial.mark.mod
httpClient = new DefaultHttpClient();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectAll() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
/**
* 提供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对象 **/
Log.d(TAG, "doGet url =" +url);
HttpGet httpRequest = new HttpGet(url);
Log.d(TAG, "doGet httpRequest =" +httpRequest);
Log.d(TAG, "doGet this.getHeader() =" +this.getHeader());
//httpRequest.setHeaders(this.getHeader());//cbk.dial.mark.del
try {
/** 保持会话Session **/
/** 设置Cookie **/
/*DialPermmitHttpCookies li = new DialPermmitHttpCookies(context);
CookieStore cs = li.getuCookie();
Log.d(TAG, "doGet cs =" +cs);*///cbk.dial.mark.del
/** 第一次请求App保存的Cookie为空,所以什么也不做,只有当APP的Cookie不为空的时。把请请求的Cooke放进去 **/
/*if (cs != null) {
httpClient.setCookieStore(li.getuCookie());
}*///cbk.dial.mark.del
/** 保持会话Session end **/
Log.d(TAG, "doGet httpClient.execute begin");
/* 发送请求并等待响应 */
HttpResponse httpResponse = httpClient.execute(httpRequest);
Log.d(TAG, "doGet httpClient.execute end");
Log.d(TAG, "doGet StatusCode" +httpResponse.getStatusLine().getStatusCode());
/* 若状态码为200 ok */
if (httpResponse.getStatusLine().getStatusCode() == 200) {
/* 读返回数据 */
strResult = EntityUtils.toString(httpResponse.getEntity());
/** 执行成功之后得到 **/
/** 成功之后把返回成功的Cookis保存APP中 **/
// 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis
/*li.setuCookie(httpClient.getCookieStore());*///cbk.dial.mark.del
} else {
strResult = "Error Response: "
+ httpResponse.getStatusLine().toString();
Log.d(TAG, "doGet Error Response: " +strResult);
}
} catch (ClientProtocolException e) {
strResult = nullToString(e.getMessage());
Log.d(TAG, "doGet strResult =ClientProtocolException");
e.printStackTrace();
} catch (IOException e) {
strResult = nullToString(e.getMessage());
Log.d(TAG, "doGet strResult =IOException");
e.printStackTrace();
} catch (Exception e) {
strResult = nullToString(e.getMessage());
Log.d(TAG, "doGet strResult =Exception");
e.printStackTrace();
} finally {
httpRequest.abort();
this.shutDownClient();
Log.d(TAG, "doGet finally 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
*/
DialPermmitHttpCookies li = new DialPermmitHttpCookies(context);
Log.d(TAG, "getHttpClient li =" +li);
String proxyStr = li.getHttpProxyStr();
Log.d(TAG, "getHttpClient proxyStr =" +proxyStr);
if (proxyStr != null && proxyStr.trim().length() > 0) {
HttpHost proxy = new HttpHost(proxyStr, 80);
Log.d(TAG, "getHttpCli