HttpClient远程post请求接口工具类

需求:

              调用别人接口,需要传入URL,参数,cookie值(这些都可以根据实际需求改变)


              只需要调用dopost即可,别的方法都是dopost调用,有一些设置连接时间,连接数等


工具类代码:

    

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;

import org.apache.commons.httpclient.HttpStatus;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

/**
 * 基于HttpClient 4.3.x版本的客户端
 * 
 * 
 * 工具类功能:传入URL,map参数和cookie值,请求远程接口,
 * 		cookie可以省略需要把设置setHeader注掉即可,map为请求参数的键值对,返回字符串
 * 		此工具类可以根据功能不同适当调整
 * 
 */
public class HttpClientUtil {
	private static PoolingHttpClientConnectionManager cm;
	private static RequestConfig requestConfig;
	
	public static String doPost(String url, Map<String,String> map,String cookieString) throws Exception {
		// 创建httpClient实例.
		CloseableHttpClient httpclient = getConnection();
		// 创建httppost
		HttpPost httppost = new HttpPost(url);
		// 创建参数队列
		try {
			List<NameValuePair> list = 
					new ArrayList<NameValuePair>();
			Iterator iterator = map.entrySet().iterator();
			while(iterator.hasNext()){
				Entry<String, String> elem = (Entry<String, String>)iterator.next();
				list.add(new BasicNameValuePair(elem.getKey(), elem.getValue()));
			}
			UrlEncodedFormEntity string = new UrlEncodedFormEntity(list, "utf-8"); 
			httppost.setEntity(string);
			
			httppost.setHeader("Cookie", cookieString);
			
			CloseableHttpResponse response = httpclient.execute(httppost);
			try {
				HttpEntity entity = response.getEntity();
				int statusCode = response.getStatusLine().getStatusCode();
					if (statusCode == HttpStatus.SC_OK) {
						if (entity != null) {
							return EntityUtils.toString(entity, "UTF-8");
						}
					} else {

						throw new Exception(response.getStatusLine()
								.getReasonPhrase());
					}
			} finally {
				response.close();
			}
		} catch (ClientProtocolException e) {
			throw e;
		} finally {
			// 关闭连接,释放资源
			// try {
			// httpclient.close();
			// } catch (IOException e) {
			// e.printStackTrace();
			// }
		}
		return null;
	}

	private static CloseableHttpClient getConnection() {
		return HttpClients.custom()
				.setConnectionManager(getConnectionManager())
				.setDefaultRequestConfig(getRequestConfig()).build();
	}

	private static synchronized PoolingHttpClientConnectionManager getConnectionManager() {
		if (null == cm) {
			cm = new PoolingHttpClientConnectionManager();
			cm.setMaxTotal(600);
			cm.setDefaultMaxPerRoute(100);
			new IdleConnectionMonitor(cm).start();
		}
		return cm;
	}

	private static synchronized RequestConfig getRequestConfig() {
		if (null == requestConfig) {
			requestConfig = RequestConfig
					.custom()
					.setConnectionRequestTimeout(60000)
					.setSocketTimeout(60000)
					.setConnectTimeout(60000)
					.build();
		}
		return requestConfig;
	}


}

class IdleConnectionMonitor extends Thread {
	PoolingHttpClientConnectionManager cm;
	private volatile boolean shutdown;

	public IdleConnectionMonitor(PoolingHttpClientConnectionManager cm) {
		super();
		this.cm = cm;
	}

	@Override
	public void run() {
		try {
			while (!shutdown) {
				synchronized (this) {
					wait(5000);
					// Close expired connections
					cm.closeExpiredConnections();
					// Optionally, close connections
					// that have been idle longer than 30 sec
					cm.closeIdleConnections(30, TimeUnit.SECONDS);
				}
			}
		} catch (InterruptedException ex) {
			// terminate
		}
	}

	public void shutdown() {
		shutdown = true;
		synchronized (this) {
			notifyAll();
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值