http之httpClient工具类
http之httpClient工具类
1.HttpProtocolHandler.java
package com.crs.ticket.utils.httpclient; import java.io.File; import java.io.IOException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpConnectionManager; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.multipart.FilePart; import org.apache.commons.httpclient.methods.multipart.FilePartSource; import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; import org.apache.commons.httpclient.methods.multipart.Part; import org.apache.commons.httpclient.methods.multipart.StringPart; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread; public class HttpProtocolHandler { private static String DEFAULT_CHARSET = "utf-8"; /** 连接超时时间,由bean factory设置,缺省为8秒钟 */ private int defaultConnectionTimeout = 8000; /** 回应超时时间, 由bean factory设置,缺省为60秒钟 */ private int defaultSoTimeout = 2 * 60000; /** 闲置连接超时时间, 由bean factory设置,缺省为60秒钟 */ private int defaultIdleConnTimeout = 60000; private int defaultMaxConnPerHost = 30; private int defaultMaxTotalConn = 80; /** 默认等待HttpConnectionManager返回连接超时(只有在达到最大连接数时起作用):1秒 */ private static final long defaultHttpConnectionManagerTimeout = 3 * 1000; /** * HTTP连接管理器,该连接管理器必须是线程安全的. */ private HttpConnectionManager connectionManager; private static HttpProtocolHandler httpProtocolHandler = new HttpProtocolHandler(); /** * 工厂方法 * * @return */ public static HttpProtocolHandler getInstance() { return httpProtocolHandler; } /** * 私有的构造方法 */ private HttpProtocolHandler() { // 创建一个线程安全的HTTP连接池 connectionManager = new MultiThreadedHttpConnectionManager(); connectionManager.getParams().setDefaultMaxConnectionsPerHost( defaultMaxConnPerHost); connectionManager.getParams().setMaxTotalConnections( defaultMaxTotalConn); IdleConnectionTimeoutThread ict = new IdleConnectionTimeoutThread(); ict.addConnectionManager(connectionManager); ict.setConnectionTimeout(defaultIdleConnTimeout); ict.start(); } /** * 执行Http请求 * * @param request * @return */ public HttpResponse execute(HttpRequest request) { HttpClient httpclient = new HttpClient(connectionManager); /* httpclient.getHostConfiguration().setProxy("10.199.75.12", 8080); UsernamePasswordCredentials creds = new UsernamePasswordCredentials("v_chenxuan", "abcd1234"); httpclient.getState().setProxyCredentials(AuthScope.ANY, creds); */ // 设置连接超时 int connectionTimeout = defaultConnectionTimeout; if (request.getConnectionTimeout() > 0) { connectionTimeout = request.getConnectionTimeout(); } httpclient.getHttpConnectionManager().getParams() .setConnectionTimeout(connectionTimeout); // 设置回应超时 int soTimeout = defaultSoTimeout; if (request.getTimeout() > 0) { soTimeout = request.getTimeout(); } httpclient.getHttpConnectionManager().getParams() .setSoTimeout(soTimeout); // 设置等待ConnectionManager释放connection的时间 httpclient.getParams().setConnectionManagerTimeout( defaultHttpConnectionManagerTimeout); String charset = request.getCharset(); charset = charset == null ? DEFAULT_CHARSET : charset; HttpMethod method = null; if (request.getMethod().equals(HttpRequest.METHOD_GET)) { method = new GetMethod(request.getUrl()); method.getParams().setCredentialCharset(charset); // parseNotifyConfig会保证使用GET方法时,request一定使用QueryString method.setQueryString(request.getQueryString()); } else { method = new PostMethod(request.getUrl()); ((PostMethod) method).addParameters(request.getParameters()); method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; text/html; charset=" + charset); //application/json //application/x-www-form-urlencoded } // 设置Http Header中的User-Agent属性 method.addRequestHeader("User-Agent", "Mozilla/4.0"); HttpResponse response = new HttpResponse(); try { httpclient.executeMethod(method); if (request.getResultType().equals(HttpResultType.STRING)) { response.setStringResult(method.getResponseBodyAsString()); } else if (request.getResultType().equals(HttpResultType.BYTES)) { response.setByteResult(method.getResponseBody()); } response.setResponseHeaders(method.getResponseHeaders()); } catch (UnknownHostException ex) { return null; } catch (IOException ex) { return null; } catch (Exception ex) { return null; } finally { method.releaseConnection(); } return response; } /** * 执行Http请求 * * @param request 请求数据 * @param strParaFileName 文件类型的参数名 * @param strFilePath 文件路径 * @return * @throws HttpException, IOException */ public HttpResponse execute(HttpRequest request, String strParaFileName, String strFilePath) throws HttpException, IOException { HttpClient httpclient = new HttpClient(connectionManager); // 设置连接超时 int connectionTimeout = defaultConnectionTimeout; if (request.getConnectionTimeout() > 0) { connectionTimeout = request.getConnectionTimeout(); } httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout); // 设置回应超时 int soTimeout = defaultSoTimeout; if (request.getTimeout() > 0) { soTimeout = request.getTimeout(); } httpclient.getHttpConnectionManager().getParams().setSoTimeout(soTimeout); // 设置等待ConnectionManager释放connection的时间 httpclient.getParams().setConnectionManagerTimeout(defaultHttpConnectionManagerTimeout); String charset = request.getCharset(); charset = charset == null ? DEFAULT_CHARSET : charset; HttpMethod method = null; //get模式且不带上传文件 if (request.getMethod().equals(HttpRequest.METHOD_GET)) { method = new GetMethod(request.getUrl()); method.getParams().setCredentialCharset(charset); // parseNotifyConfig会保证使用GET方法时,request一定使用QueryString method.setQueryString(request.getQueryString()); } else if(strParaFileName.equals("") && strFilePath.equals("")) { //post模式且不带上传文件 method = new PostMethod(request.getUrl()); ((PostMethod) method).addParameters(request.getParameters()); method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; text/html; charset=" + charset); } else { //post模式且带上传文件 method = new PostMethod(request.getUrl()); List<Part> parts = new ArrayList<Part>(); for (int i = 0; i < request.getParameters().length; i++) { parts.add(new StringPart(request.getParameters()[i].getName(), request.getParameters()[i].getValue(), charset)); } //增加文件参数,strParaFileName是参数名,使用本地文件 parts.add(new FilePart(strParaFileName, new FilePartSource(new File(strFilePath)))); // 设置请求体 ((PostMethod) method).setRequestEntity(new MultipartRequestEntity(parts.toArray(new Part[0]), new HttpMethodParams())); } // 设置Http Header中的User-Agent属性 method.addRequestHeader("User-Agent", "Mozilla/4.0"); HttpResponse response = new HttpResponse(); try { httpclient.executeMethod(method); if (request.getResultType().equals(HttpResultType.STRING)) { response.setStringResult(method.getResponseBodyAsString()); } else if (request.getResultType().equals(HttpResultType.BYTES)) { response.setByteResult(method.getResponseBody()); } response.setResponseHeaders(method.getResponseHeaders()); } catch (UnknownHostException ex) { return null; } catch (IOException ex) { return null; } catch (Exception ex) { return null; } finally { method.releaseConnection(); } return response; } /** * 将NameValuePairs数组转变为字符串 * * @param nameValues * @return */ protected String toString(NameValuePair[] nameValues) { if (nameValues == null || nameValues.length == 0) { return "null"; } StringBuffer buffer = new StringBuffer(); for (int i = 0; i < nameValues.length; i++) { NameValuePair nameValue = nameValues[i]; if (i == 0) { buffer.append(nameValue.getName() + "=" + nameValue.getValue()); } else { buffer.append("&" + nameValue.getName() + "=" + nameValue.getValue()); } } return buffer.toString(); } }
2.HttpRequest.java
package com.crs.ticket.utils.httpclient; import org.apache.commons.httpclient.NameValuePair; public class HttpRequest { /** HTTP GET method */ public static final String METHOD_GET = "GET"; /** HTTP POST method */ public static final String METHOD_POST = "POST"; /** * 待请求的url */ private String url = null; /** * 默认的请求方式 */ private String method = METHOD_POST; private int timeout = 0; private int connectionTimeout = 0; /** * Post方式请求时组装好的参数值对 */ private NameValuePair[] parameters = null; /** * Get方式请求时对应的参数 */ private String queryString = null; /** * 默认的请求编码方式 */ private String charset = "utf-8"; /** * 请求发起方的ip地址 */ private String clientIp; /** * 请求返回的方式 */ private HttpResultType resultType = HttpResultType.BYTES; public HttpRequest(HttpResultType resultType) { super(); this.resultType = resultType; } /** * @return Returns the clientIp. */ public String getClientIp() { return clientIp; } /** * @param clientIp * The clientIp to set. */ public void setClientIp(String clientIp) { this.clientIp = clientIp; } public NameValuePair[] getParameters() { return parameters; } public void setParameters(NameValuePair[] parameters) { this.parameters = parameters; } public String getQueryString() { return queryString; } public void setQueryString(String queryString) { this.queryString = queryString; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public int getConnectionTimeout() { return connectionTimeout; } public void setConnectionTimeout(int connectionTimeout) { this.connectionTimeout = connectionTimeout; } public int getTimeout() { return timeout; } public void setTimeout(int timeout) { this.timeout = timeout; } /** * @return Returns the charset. */ public String getCharset() { return charset; } /** * @param charset * The charset to set. */ public void setCharset(String charset) { this.charset = charset; } public HttpResultType getResultType() { return resultType; } public void setResultType(HttpResultType resultType) { this.resultType = resultType; } }
3.HttpResponse.java
package com.crs.ticket.utils.httpclient; import java.io.UnsupportedEncodingException; import org.apache.commons.httpclient.Header; /** *类名:HttpResponse *功能:Http返回对象的封装 *详细:封装Http返回信息 *版本:3.2 *日期:2011-03-17 *说明: */ public class HttpResponse { /** * 返回中的Header信息 */ private Header[] responseHeaders; /** * String类型的result */ private String stringResult; /** * btye类型的result */ private byte[] byteResult; public Header[] getResponseHeaders() { return responseHeaders; } public void setResponseHeaders(Header[] responseHeaders) { this.responseHeaders = responseHeaders; } public byte[] getByteResult() { if (byteResult != null) { return byteResult; } if (stringResult != null) { return stringResult.getBytes(); } return null; } public void setByteResult(byte[] byteResult) { this.byteResult = byteResult; } public String getStringResult() throws UnsupportedEncodingException { if (stringResult != null) { return stringResult; } if (byteResult != null) { return new String(byteResult, "utf-8"); } return null; } public void setStringResult(String stringResult) { this.stringResult = stringResult; } }
4.HttpResultType.java
/** * Alipay.com Inc. * Copyright (c) 2004-2005 All Rights Reserved. */ package com.crs.ticket.utils.httpclient; public enum HttpResultType { /** * 字符串方式 */ STRING, /** * 字节数组方式 */ BYTES }
划船不用桨、杨帆不等风、一生全靠浪