package com.xiaocan.demo.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;

/**
 * <p>Http工具类
 * 
 * <p>Http工具类,为系统提供通用Http访问操作方法:
 * 
 * <p>1、发送GET请求;
 * <p>2、发送POST请求。
 * 
 */
public class HttpUtil {

	/**
	 * <p>发送GET请求
	 * 
	 * @param  url GET请求地址
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 */
	public static byte[] doGet(String url) {

		return HttpUtil.doGet(url , null , null , 0);
	}

	/**
	 * <p>发送GET请求
	 * 
	 * @param  url       GET请求地址
	 * @param  headerMap GET请求头参数容器
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 */
	public static byte[] doGet(String url , Map headerMap) {

		return HttpUtil.doGet(url , headerMap , null , 0);
	}

	/**
	 * <p>发送GET请求
	 * 
	 * @param  url       GET请求地址
	 * @param  proxyUrl  代理服务器地址
	 * @param  proxyPort 代理服务器端口号
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 * @modify 窦海宁, 2012-03-19
	 */
	public static byte[] doGet(String url , String proxyUrl , int proxyPort) {

		return HttpUtil.doGet(url , null , proxyUrl , proxyPort);
	}

	/**
	 * <p>发送GET请求
	 * 
	 * @param  url       GET请求地址
	 * @param  headerMap GET请求头参数容器
	 * @param  proxyUrl  代理服务器地址
	 * @param  proxyPort 代理服务器端口号
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 * @modify 窦海宁, 2012-03-19
	 */
	public static byte[] doGet(String url , Map headerMap , String proxyUrl , int proxyPort) {

		byte[]     content    = null;
		HttpClient httpClient = new HttpClient();
		GetMethod  getMethod  = new GetMethod(url);

		if (headerMap != null) {

			//头部请求信息
			if (headerMap != null) {

				Iterator iterator = headerMap.entrySet().iterator();
				while (iterator.hasNext()) {

					Entry entry = (Entry) iterator.next();
					getMethod.addRequestHeader(entry.getKey().toString() , entry.getValue().toString());
				}
			}
		}

		if (StringUtils.isNotBlank(proxyUrl)) {

			httpClient.getHostConfiguration().setProxy(proxyUrl , proxyPort);
		}

		//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略
		getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT , 10000);
		//postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER , new DefaultHttpMethodRetryHandler());
		InputStream inputStream = null;
		try {

			if (httpClient.executeMethod(getMethod) == HttpStatus.SC_OK) {

				//读取内容
				inputStream = getMethod.getResponseBodyAsStream();
				content     = IOUtils.toByteArray(inputStream);
			} else {

				System.err.println("Method failed: " + getMethod.getStatusLine());
			}
		} catch (IOException ex) {

			ex.printStackTrace();
		} finally {

			IOUtils.closeQuietly(inputStream);
			getMethod.releaseConnection();
		}
		return content;
	}

	/**
	 * <p>发送POST请求
	 * 
	 * @param  url          POST请求地址
	 * @param  parameterMap POST请求参数容器
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 */
	public static byte[] doPost(String url , Map parameterMap) {

		return HttpUtil.doPost(url , null , parameterMap , null , null , 0);
	}

	/**
	 * <p>发送POST请求
	 * 
	 * @param  url          POST请求地址
	 * @param  parameterMap POST请求参数容器
	 * @param  paramCharset 参数字符集名称
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 * @modify 窦海宁, 2012-05-21
	 */
	public static byte[] doPost(String url , Map parameterMap , String paramCharset) {

		return HttpUtil.doPost(url , null , parameterMap , paramCharset , null , 0);
	}

	/**
	 * <p>发送POST请求
	 * 
	 * @param  url          POST请求地址
	 * @param  headerMap    POST请求头参数容器
	 * @param  parameterMap POST请求参数容器
	 * @param  paramCharset 参数字符集名称
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 * @modify 窦海宁, 2012-05-21
	 */
	public static byte[] doPost(String url , Map headerMap , Map parameterMap , String paramCharset) {

		return HttpUtil.doPost(url , headerMap , parameterMap , paramCharset , null , 0);
	}

	/**
	 * <p>发送POST请求
	 * 
	 * @param  url          POST请求地址
	 * @param  parameterMap POST请求参数容器
	 * @param  paramCharset 参数字符集名称
	 * @param  proxyUrl     代理服务器地址
	 * @param  proxyPort    代理服务器端口号
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 */
	public static byte[] doPost(String url , Map parameterMap , String paramCharset , String proxyUrl , int proxyPort) {

		return HttpUtil.doPost(url , null , parameterMap , paramCharset , proxyUrl , proxyPort);
	}

	/**
	 * <p>发送POST请求
	 * 
	 * @param  url          POST请求地址
	 * @param  headerMap    POST请求头参数容器
	 * @param  parameterMap POST请求参数容器
	 * @param  paramCharset 参数字符集名称
	 * @param  proxyUrl     代理服务器地址
	 * @param  proxyPort    代理服务器端口号
	 * 
	 * @return 与当前请求对应的响应内容字节数组
	 * 
	 * @modify 窦海宁, 2012-05-21
	 */
	public static byte[] doPost(String url , Map headerMap , Map parameterMap , String paramCharset , String proxyUrl , int proxyPort) {

		byte[]     content    = null;
		HttpClient httpClient = new HttpClient();
		PostMethod postMethod = new PostMethod(url);

		if (StringUtils.isNotBlank(paramCharset)) {

			postMethod.getParams().setContentCharset(paramCharset);
			postMethod.getParams().setHttpElementCharset(paramCharset);
		}

		if (headerMap != null) {

			//头部请求信息
			if (headerMap != null) {

				Iterator iterator = headerMap.entrySet().iterator();
				while (iterator.hasNext()) {

					Entry entry = (Entry) iterator.next();
					postMethod.addRequestHeader(entry.getKey().toString() , entry.getValue().toString());
				}
			}
		}

		Iterator iterator = parameterMap.keySet().iterator();
		while (iterator.hasNext()) {

			String key = (String) iterator.next();
			postMethod.addParameter(key , (String) parameterMap.get(key));
		}

		if (StringUtils.isNotBlank(proxyUrl)) {

			httpClient.getHostConfiguration().setProxy(proxyUrl , proxyPort);
		}

		//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略
		postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT , 10000);
		//postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER , new DefaultHttpMethodRetryHandler());
		InputStream inputStream = null;
		try {

			if (httpClient.executeMethod(postMethod) == HttpStatus.SC_OK) {

				//读取内容
				inputStream = postMethod.getResponseBodyAsStream();
				content     = IOUtils.toByteArray(inputStream);
			} else {

				System.err.println("Method failed: " + postMethod.getStatusLine());
			}
		} catch (IOException ex) {

			ex.printStackTrace();
		} finally {

			IOUtils.closeQuietly(inputStream);
			postMethod.releaseConnection();
		}
		return content;
	}
	
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("wd", "nima");
		byte[] b = doGet("http://www.baidu.com", map);
		System.out.println("-------------------"+new String(b));
	}

}
最近下载更多
daichenguang  LV1 2021年7月28日
13598405058  LV1 2020年8月17日
冰锋之泪  LV7 2020年7月3日
1741478474  LV8 2019年11月29日
hjweifans  LV5 2018年4月13日
wwy005  LV1 2017年12月9日
JaJaJamBo  LV9 2017年10月19日
wyx065747  LV67 2017年8月9日
shao139772  LV14 2017年6月7日
liangsen  LV3 2017年3月16日
最近浏览更多
DeepLoveDeep  LV2 2023年3月30日
wangxinshui  LV1 2022年1月14日
1358849392  LV21 2022年1月7日
阿远远  LV8 2021年11月26日
daichenguang  LV1 2021年7月28日
a4276161 2021年5月14日
暂无贡献等级
329512801  LV28 2021年4月8日
Nidhogg_1314 2021年1月1日
暂无贡献等级
13598405058  LV1 2020年8月17日
yaduomo  LV1 2020年8月17日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友