package com.fpcms.common.util; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; 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.params.HttpClientParams; import org.apache.commons.httpclient.params.HttpConnectionManagerParams; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.commons.io.IOUtils; import org.apache.shiro.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NetUtil { private static Logger logger = LoggerFactory.getLogger(NetUtil.class); public static MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager(); static HttpClient client = new HttpClient(); static { init(); } public static void init() { if (manager != null) { manager.shutdown(); manager = null; } int connetctTimeout = 10000; int soTimeout = 25000; manager = new MultiThreadedHttpConnectionManager(); System.setProperty("apache.commons.httpclient.cookiespec","COMPATIBILITY"); HttpConnectionManagerParams params = new HttpConnectionManagerParams(); params.setDefaultMaxConnectionsPerHost(50); params.setMaxTotalConnections(1000); params.setConnectionTimeout(connetctTimeout); params.setSoTimeout(soTimeout); manager.setParams(params); manager.closeIdleConnections(15000); client.setHttpConnectionManager(manager); HttpClientParams cparams = new HttpClientParams(); cparams.setConnectionManagerTimeout(connetctTimeout); cparams.setSoTimeout(soTimeout); client.setParams(cparams); } public static String httpGet(String url) { return httpGet(url,null); } public static String httpGet(String url, String parameters) { String finalUrl = getUrlWithParameters(url, parameters); logger.info("httpGet:"+finalUrl+" parameters:"+parameters); GetMethod method = new GetMethod(finalUrl); method.setFollowRedirects(true); setHeaders(method); return executeForString(finalUrl, method); } private static String executeForString(String finalUrl, HttpMethodBase method) { try { client.executeMethod(method); String charset = getCharset(method); InputStream is = method.getResponseBodyAsStream(); return IOUtils.toString(is,charset); } catch (Exception e) { throw new RuntimeException("读取url=[" + finalUrl + "]数据异常",e); } finally { method.releaseConnection(); } } private static void setHeaders(HttpMethodBase method) { method.setRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1"); method.setRequestHeader("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); method.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); } public static String httpPost(String url, String postBody,String contentType) { PostMethod method = newPostMethod(url); method.setRequestBody(postBody); method.setRequestHeader("Content-Type", contentType); return executeForString(url,method); } public static String httpPost(String url, Map<String,Object> parameters) { PostMethod method = newPostMethod(url); List<NameValuePair> params = new ArrayList<NameValuePair>(); for(String key : parameters.keySet()) { String value = String.valueOf(parameters.get(key)); params.add(new NameValuePair(key, value)); } method.setRequestBody(params.toArray(new NameValuePair[params.size()])); return executeForString(url,method); } private static PostMethod newPostMethod(String url) { logger.info("httpPost:"+url); PostMethod method = new PostMethod(url); method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8"); setHeaders(method); return method; } private static String getCharset(HttpMethodBase method) throws IOException { String responseBodyAsString = method.getResponseBodyAsString(); String charset = HtmlUtil.getCharsetFromHtml(responseBodyAsString); return org.apache.commons.lang.StringUtils.defaultIfBlank(charset,method.getResponseCharSet()); } private static String getUrlWithParameters(String url, String parameters) { String finalUrl = null; if(url.contains("?")) { finalUrl = url + "&" + encode(parameters); }else { finalUrl = url + "?" + encode(parameters); } return finalUrl; } private static String encode(String parameters) { if(parameters == null) return null; try { return URLEncoder.encode(parameters, "UTF-8").replace("%3D", "=").replace("%26", "&"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } }