package com.kmall.common.utils;
import com.alibaba.fastjson.JSON;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.cookie.CookieSpec;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Http请求通用工具
*
* @author Scott
* @date 2017年11月18日 下午13:13:23
*/
public class HttpUtil {
private static final Log logger = LogFactory.getLog(HttpUtil.class);
/**
* 定义编码格式 UTF-8
*/
public static final String URL_PARAM_DECODECHARSET_UTF8 = "UTF-8";
/**
* 定义编码格式 GBK
*/
public static final String URL_PARAM_DECODECHARSET_GBK = "GBK";
private static final String URL_PARAM_CONNECT_FLAG = "&";
private static final String EMPTY = "";
private static MultiThreadedHttpConnectionManager connectionManager = null;
private static int connectionTimeOut = 25000;
private static int socketTimeOut = 25000;
private static int maxConnectionPerHost = 20;
private static int maxTotalConnections = 20;
private static HttpClient client;
/**
* 当前登录的人
*/
static Cookie[] cookies = null;
// 登录URL
static String loginURL = "/admin/login.do";
// 登录账户
static String loginUserName = "admin";
static String loginPassword = "admin";
static {
connectionManager = new MultiThreadedHttpConnectionManager();
connectionManager.getParams().setConnectionTimeout(connectionTimeOut);
connectionManager.getParams().setSoTimeout(socketTimeOut);
connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxConnectionPerHost);
connectionManager.getParams().setMaxTotalConnections(maxTotalConnections);
client = new HttpClient(connectionManager);
}
/**
* POST方式提交数据
*
* @param url 待请求的URL
* @param params 要提交的数据
* @param enc 编码
* @return 响应结果
* @throws IOException IO异常
*/
public static String URLPost(String url, Map params, String enc) {
String response = EMPTY;
PostMethod postMethod = null;
try {
postMethod = new PostMethod(url);
postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
//将表单的值放入postMethod中
Set keySet = params.keySet();
for (String key : keySet) {
Object value = params.get(key);
postMethod.addParameter(key, String.valueOf(value));
}
//执行postMethod
int statusCode = client.executeMethod(postMethod);
if (statusCode == HttpStatus.SC_OK) {
response = postMethod.getResponseBodyAsString();
} else {
logger.error("响应状态码 = " + postMethod.getStatusCode());
}
} catch (HttpException e) {
logger.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("发生网络异常", e);
e.printStackTrace();
} finally {
if (postMethod != null) {
postMethod.releaseConnection();
postMethod = null;
}
}
return response;
}
/**
* POST方式提交数据
*
* @param url 待请求的URL
* @param params 要提交的数据
* @param enc 编码
* @return 响应结果
* @throws IOException IO异常
*/
public static String URLPost(String url, Map header, Map params, String enc) {
String response = EMPTY;
PostMethod postMethod = null;
try {
postMethod = new PostMethod(url);
postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
if (null != header && header.size() > 0) {
for (Map.Entry entry : header.entrySet()) {
postMethod.setRequestHeader(entry.getKey(), String.valueOf(entry.getValue()));
}
}
//将表单的值放入postMethod中
Set keySet = params.keySet();
for (String key : keySet) {
Object value = params.get(key);
postMethod.addParameter(key, String.valueOf(value));
}
//执行postMethod
int statusCode = client.executeMethod(postMethod);
if (statusCode == HttpStatus.SC_OK) {
response = postMethod.getResponseBodyAsString();
} else {
logger.error("响应状态码 = " + postMethod.getStatusCode());
}
} catch (HttpException e) {
logger.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("发生网络异常", e);
e.printStackTrace();
} finally {
if (postMethod != null) {
postMethod.releaseConnection();
postMethod = null;
}
}
return response;
}
/**
* POST方式提交数据
*
* @param url 待请求的URL
* @param params 要提交的数据
* @param enc 编码
* @return 响应结果
* @throws IOException IO异常
*/
public static String URLPostByJsonData(String url, Map header, Map params, String enc) {
String response = EMPTY;
PostMethod postMethod = null;
try {
postMethod = new PostMethod(url);
postMethod.setRequestHeader("Content-Type", "application/json;charset=" + enc);
if (null != header && header.size() > 0) {
for (Map.Entry entry : header.entrySet()) {
postMethod.setRequestHeader(entry.getKey(), String.valueOf(entry.getValue()));
}
}
RequestEntity entity = new StringRequestEntity(JSON.toJSONString(params), "application/json", "UTF-8");
postMethod.setRequestEntity(entity);
//执行postMethod
int statusCode = client.executeMethod(postMethod);
if (statusCode == HttpStatus.SC_OK) {
response = postMethod.getResponseBodyAsString();
} else {
logger.error("响应状态码 = " + postMethod.getStatusCode());
}
} catch (HttpException e) {
logger.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("发生网络异常", e);
e.printStackTrace();
} finally {
if (postMethod != null) {
postMethod.releaseConnection();
postMethod = null;
}
}
return response;
}
/**
* GET方式提交数据
*
* @param url 待请求的URL
* @param params 要提交的数据
* @param enc 编码
* @return 响应结果
* @throws IOException IO异常
*/
public static String URLGet(String url, Map params, String enc) {
String response = EMPTY;
GetMethod getMethod = null;
StringBuffer strtTotalURL = new StringBuffer(EMPTY);
if (strtTotalURL.indexOf("?") == -1) {
strtTotalURL.append(url).append("?").append(getUrl(params, enc));
} else {
strtTotalURL.append(url).append("&").append(getUrl(params, enc));
}
logger.debug("GET请求URL = \n" + strtTotalURL.toString());
try {
getMethod = new GetMethod(strtTotalURL.toString());
getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
//执行getMethod
int statusCode = client.executeMethod(getMethod);
if (statusCode == HttpStatus.SC_OK) {
response = getMethod.getResponseBodyAsString();
} else {
logger.debug("响应状态码 = " + getMethod.getStatusCode());
}
} catch (HttpException e) {
logger.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("发生网络异常", e);
e.printStackTrace();
} finally {
if (getMethod != null) {
getMethod.releaseConnection();
getMethod = null;
}
}
return response;
}
/**
* GET方式提交数据
*
* @param url 待请求的URL
* @param params 要提交的数据
* @param enc 编码
* @return 响应结果
* @throws IOException IO异常
*/
public static String URLGet(String url, Map header, Map params, String enc) {
String response = EMPTY;
GetMethod getMethod = null;
StringBuffer strtTotalURL = new StringBuffer(EMPTY);
if (strtTotalURL.indexOf("?") == -1) {
strtTotalURL.append(url).append("?").append(getUrl(params, enc));
} else {
strtTotalURL.append(url).append("&").append(getUrl(params, enc));
}
logger.debug("GET请求URL = \n" + strtTotalURL.toString());
try {
getMethod = new GetMethod(strtTotalURL.toString());
getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
if (null != header && header.size() > 0) {
for (Map.Entry entry : header.entrySet()) {
getMethod.setRequestHeader(entry.getKey(), String.valueOf(entry.getValue()));
}
}
//执行getMethod
int statusCode = client.executeMethod(getMethod);
if (statusCode == HttpStatus.SC_OK) {
response = getMethod.getResponseBodyAsString();
} else {
logger.debug("响应状态码 = " + getMethod.getStatusCode());
}
} catch (HttpException e) {
logger.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("发生网络异常", e);
e.printStackTrace();
} finally {
if (getMethod != null) {
getMethod.releaseConnection();
getMethod = null;
}
}
return response;
}
/**
* 据Map生成URL字符串
*
* @param map Map
* @param valueEnc URL编码
* @return URL
*/
private static String getUrl(Map map, String valueEnc) {
if (null == map || map.keySet().size() == 0) {
return (EMPTY);
}
StringBuffer url = new StringBuffer();
Set keys = map.keySet();
for (Iterator it = keys.iterator(); it.hasNext(); ) {
String key = it.next();
if (map.containsKey(key)) {
String val = map.get(key).toString();
String str = val != null ? val : EMPTY;
try {
str = URLEncoder.encode(str, valueEnc);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
url.append(key).append("=").append(str).append(URL_PARAM_CONNECT_FLAG);
}
}
String strURL = EMPTY;
strURL = url.toString();
if (URL_PARAM_CONNECT_FLAG.equals(EMPTY + strURL.charAt(strURL.length() - 1))) {
strURL = strURL.substring(0, strURL.length() - 1);
}
return (strURL);
}
/**
* POST方式提交数据
*
* @param url 待请求的URL
* @param params 要提交的数据
* @param enc 编码
* @param session 带session
* @return 响应结果
* @throws IOException IO异常
*/
public static String URLPost(String url, Map params, String enc, boolean session) {
String response = EMPTY;
PostMethod postMethod = null;
if (!session) {
return URLPost(url, params, enc);
}
try {
postMethod = new PostMethod(url);
postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
//将表单的值放入postMethod中
Set keySet = params.keySet();
for (String key : keySet) {
Object value = params.get(key);
postMethod.addParameter(key, String.valueOf(value));
}
if (null != cookies) {
client.getState().addCookies(cookies);
} else {
getAuthCookie(url, enc);
client.getState().addCookies(cookies);
}
//执行postMethod
int statusCode = client.executeMethod(postMethod);
if (statusCode == HttpStatus.SC_OK) {
response = postMethod.getResponseBodyAsString();
} else {
logger.error("响应状态码 = " + postMethod.getStatusCode());
}
} catch (HttpException e) {
logger.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("发生网络异常", e);
e.printStackTrace();
} finally {
if (postMethod != null) {
postMethod.releaseConnection();
postMethod = null;
}
}
return response;
}
/**
* 获取session
*
* @param url 待请求的URL
* @param enc 编码
* @return 响应结果
* @throws IOException IO异常
*/
public static void getAuthCookie(String url, String enc) {
PostMethod postMethod = null;
try {
Object[] ipPort = getIpPortFormURL(url);
String ip = (String) ipPort[0];
int port = (Integer) ipPort[1];
String logUrl = "http://" + ip + ":" + port + loginURL;
postMethod = new PostMethod(logUrl);
postMethod.addParameter("username", loginUserName);
postMethod.addParameter("password", loginPassword);
postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
//执行postMethod
int statusCode = client.executeMethod(postMethod);
// 查看 cookie 信息
CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
cookies = cookiespec.match(ip, port, "/", false, client.getState().getCookies());
logger.error("响应状态码 = " + postMethod.getStatusCode());
} catch (HttpException e) {
logger.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("发生网络异常", e);
e.printStackTrace();
} finally {
if (postMethod != null) {
postMethod.releaseConnection();
postMethod = null;
}
}
}
/**
* 解析URL的端口和ip
*
* @param URL
* @return
*/
public static Object[] getIpPortFormURL(String URL) {
Object[] ip_port = new Object[2];
try {
java.net.URL url = new java.net.URL(URL);
ip_port[0] = url.getHost();
ip_port[1] = url.getPort() != -1 ? url.getPort() : 80;
} catch (MalformedURLException e) {
e.printStackTrace();
}
return ip_port;
}
public static void setLoginPassword(String loginPassword) {
HttpUtil.loginPassword = loginPassword;
}
public static void setLoginUserName(String loginUserName) {
HttpUtil.loginUserName = loginUserName;
}
public static void setLoginURL(String loginURL) {
HttpUtil.loginURL = loginURL;
}
public static void main(String[] args) throws MalformedURLException {
java.net.URL url = new java.net.URL("http://blog.csdn.net/zhujianlin1990");
System.out.println(url.getHost());
System.out.println(url.getPort());
}
}