package com.tencent.weibo.utils; import java.io.File; import java.net.URI; import java.nio.charset.Charset; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.params.CookiePolicy; import org.apache.http.client.params.HttpClientParams; import org.apache.http.client.utils.URIUtils; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.params.ConnPerRouteBean; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.FormBodyPart; import org.apache.http.entity.mime.MultipartEntity; 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.impl.conn.SingleClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.util.EntityUtils; import android.util.Log; /** * 自定义参数的Httpclient。<br> * 提供httpGet,httpPost两种传送消息的方式<br> * 提供httpPost上传文件的方式 */ public class QHttpClient { //TODO SDK默认参数设置 public static final int CONNECTION_TIMEOUT = 5000; public static final int CON_TIME_OUT_MS=5000; public static final int SO_TIME_OUT_MS=5000; public static final int MAX_CONNECTIONS_PER_HOST = 2; public static final int MAX_TOTAL_CONNECTIONS = 2; //日志输出 private static String TAG = "QHttpClient.class"; private HttpClient httpClient; public QHttpClient(){ this(MAX_CONNECTIONS_PER_HOST,MAX_TOTAL_CONNECTIONS,CON_TIME_OUT_MS,SO_TIME_OUT_MS); } public QHttpClient(int maxConnectionPerHost, int maxTotalConnections, int conTimeOutMs, int soTimeOutMs){ // Register the "http" & "https" protocol scheme, They are required // by the default operator to look up socket factories. SchemeRegistry supportedSchemes = new SchemeRegistry(); supportedSchemes.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); //-----------------------------------SSL Scheme------------------------------------------ try { SSLSocketFactory sslSocketFactory=SSLSocketFactory.getSocketFactory(); sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); supportedSchemes.register(new Scheme("https",new QSSLSocketFactory(), 443)); } catch (Exception e) { e.printStackTrace(); } //----------------------------------SSL Scheme end--------------------------------------- // Prepare parameters. HttpParams httpParams = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(httpParams, maxTotalConnections); ConnPerRouteBean connPerRoute = new ConnPerRouteBean(maxConnectionPerHost); ConnManagerParams.setMaxConnectionsPerRoute(httpParams, connPerRoute); HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1); HttpProtocolParams.setUseExpectContinue(httpParams, false); // ThreadSafeClientConnManager connectionManager = new ThreadSafeClientConnManager(httpParams,supportedSchemes); SingleClientConnManager singleClientConnManager=new SingleClientConnManager(httpParams,supportedSchemes); HttpConnectionParams.setConnectionTimeout(httpParams, conTimeOutMs); HttpConnectionParams.setSoTimeout(httpParams, soTimeOutMs); HttpClientParams.setCookiePolicy(httpParams, CookiePolicy.BROWSER_COMPATIBILITY); // httpClient=new DefaultHttpClient(connectionManager, httpParams); httpClient=new DefaultHttpClient(singleClientConnManager, httpParams); } /** * Get方法传送消息 * * @param url 连接的URL * @param queryString 请求参数串 * @return 服务器返回的信息 * @throws Exception */ public String httpGet(String url, String queryString) throws Exception { String responseData = null; if (queryString != null && !queryString.equals("")) { url += "?" + queryString; } Log.i(TAG, "QHttpClient httpGet [1] url = "+url); HttpGet httpGet = new HttpGet(url); httpGet.getParams().setParameter("http.socket.timeout", new Integer(CONNECTION_TIMEOUT)); try { HttpResponse response=httpClient.execute(httpGet); Log.i(TAG, "QHttpClient httpGet [2] StatusLine : "+ response.getStatusLine()); responseData =EntityUtils.toString(response.getEntity()); Log.i(TAG, "QHttpClient httpGet [3] Response = "+ responseData); } catch (Exception e) { e.printStackTrace(); } finally { httpGet.abort(); } return responseData; } /** * Post方法传送消息 * * @param url 连接的URL * @param queryString 请求参数串 * @return 服务器返回的信息 * @throws Exception */ public String httpPost(String url, String queryString) throws Exception { String responseData = null; URI tmpUri=new URI(url); URI uri = URIUtils.createURI(tmpUri.getScheme(), tmpUri.getHost(), tmpUri.getPort(), tmpUri.getPath(), queryString, null); Log.i(TAG, "QHttpClient httpPost [1] url = "+uri.toURL()); HttpPost httpPost = new HttpPost(uri); httpPost.getParams().setParameter("http.socket.timeout", new Integer(CONNECTION_TIMEOUT)); if (queryString != null && !queryString.equals("")) { StringEntity reqEntity = new StringEntity(queryString); // 设置类型 reqEntity.setContentType("application/x-www-form-urlencoded"); // 设置请求的数据 httpPost.setEntity(reqEntity); } try { HttpResponse response=httpClient.execute(httpPost); Log.i(TAG, "QHttpClient httpPost [2] StatusLine = "+response.getStatusLine()); responseData =EntityUtils.toString(response.getEntity()); Log.i(TAG, "QHttpClient httpPost [3] responseData = "+responseData); } catch (Exception e) { e.printStackTrace(); }finally{ httpPost.abort(); } return responseData; } /** * Post方法传送文件和消息 * * @param url 连接的URL * @param queryString 请求参数串 * @param files 上传的文件列表 * @return 服务器返回的信息 * @throws Exception */ public String httpPostWithFile(String url, String queryString, List<NameValuePair> files) throws Exception { String responseData = null; URI tmpUri=new URI(url); URI uri = URIUtils.createURI(tmpUri.getScheme(), tmpUri.getHost(), tmpUri.getPort(), tmpUri.getPath(), queryString, null); Log.i(TAG, "QHttpClient httpPostWithFile [1] uri = "+uri.toURL()); MultipartEntity mpEntity = new MultipartEntity(); HttpPost httpPost = new HttpPost(uri); StringBody stringBody; FileBody fileBody; File targetFile; String filePath; FormBodyPart fbp; List<NameValuePair> queryParamList=QStrOperate.getQueryParamsList(queryString); for(NameValuePair queryParam:queryParamList){ stringBody=new StringBody(queryParam.getValue(),Charset.forName("UTF-8")); fbp= new FormBodyPart(queryParam.getName(), stringBody); mpEntity.addPart(fbp); // Log.i(TAG, "------- "+queryParam.getName()+" = "+queryParam.getValue()); } for (NameValuePair param : files) { filePath = param.getValue(); targetFile= new File(filePath); fileBody = new FileBody(targetFile,"application/octet-stream"); fbp= new FormBodyPart(param.getName(), fileBody); mpEntity.addPart(fbp); } // Log.i(TAG, "---------- Entity Content Type = "+mpEntity.getContentType()); httpPost.setEntity(mpEntity); try { HttpResponse response=httpClient.execute(httpPost); Log.i(TAG, "QHttpClient httpPostWithFile [2] StatusLine = "+response.getStatusLine()); responseData =EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); }finally{ httpPost.abort(); } Log.i(TAG, "QHttpClient httpPostWithFile [3] responseData = "+responseData); return responseData; } /** * 断开QHttpClient的连接 */ public void shutdownConnection(){ try { httpClient.getConnectionManager().shutdown(); } catch (Exception e) { e.printStackTrace(); } } }