需求:
调用别人接口,需要传入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();
}
}
}