packagecom.feilong.reptile.util;importjava.io.IOException;importjava.io.InterruptedIOException;importjava.net.UnknownHostException;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;importjavax.net.ssl.SSLException;importorg.apache.commons.codec.Charsets;importorg.apache.http.Header;importorg.apache.http.HttpEntityEnclosingRequest;importorg.apache.http.HttpRequest;importorg.apache.http.HttpResponse;importorg.apache.http.client.HttpClient;importorg.apache.http.client.HttpRequestRetryHandler;importorg.apache.http.client.config.RequestConfig;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.client.protocol.HttpClientContext;importorg.apache.http.client.utils.URIBuilder;importorg.apache.http.config.SocketConfig;importorg.apache.http.conn.ConnectTimeoutException;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.impl.conn.PoolingHttpClientConnectionManager;importorg.apache.http.protocol.HttpContext;importorg.apache.http.util.EntityUtils;/*** 使用HttpClient发送和接收Http请求
*
*@authormanzhizhen
**/
public classHttpUtils {private staticHttpClient httpClient;//最大连接数
private static final int MAX_CONNECTION = 100;//每个route能使用的最大连接数,一般和MAX_CONNECTION取值一样
private static final int MAX_CONCURRENT_CONNECTIONS = 100;//建立连接的超时时间,单位毫秒
private static final int CONNECTION_TIME_OUT = 1000;//请求超时时间,单位毫秒
private static final int REQUEST_TIME_OUT = 1000;//最大失败重试次数
private static final int MAX_FAIL_RETRY_COUNT = 3;//请求配置,可以复用
private staticRequestConfig requestConfig;static{
SocketConfig socketConfig=SocketConfig.custom()
.setSoTimeout(REQUEST_TIME_OUT).setSoKeepAlive(true)
.setTcpNoDelay(true).build();
requestConfig=RequestConfig.custom()
.setSocketTimeout(REQUEST_TIME_OUT)
.setConnectTimeout(CONNECTION_TIME_OUT).build();/*** 每个默认的 ClientConnectionPoolManager 实现将给每个route创建不超过2个并发连接,最多20个连接总数。*/PoolingHttpClientConnectionManager connManager= newPoolingHttpClientConnectionManager();
connManager.setMaxTotal(MAX_CONNECTION);
connManager.setDefaultMaxPerRoute(MAX_CONCURRENT_CONNECTIONS);
connManager.setDefaultSocketConfig(socketConfig);
httpClient=HttpClients.custom().setConnectionManager(connManager)//添加重试处理器
.setRetryHandler(newMyHttpRequestRetryHandler()).build();
}public static voidmain(String[] args) {
testGet();
}/*** 测试get方法*/
private static voidtestGet() {
String url= "http://restapi.amap.com/v3/place/text";
Map paramMap = new HashMap();
paramMap.put("key", "95708f902ac2428ea119ec99fb70e6a3");
paramMap.put("keywords", "互联网金融大厦");
paramMap.put("city", "330100");
paramMap.put("extensions", "all");try{
System.out.println(get(url, paramMap));
}catch(Exception e) {
e.printStackTrace();
}
}/*** post请求
*
*@paramurl
*@paramparamMap
*@paramheaders
*@return*@throwsException*/
public static String post(String url, MapparamMap,
List headers) throwsException {
URIBuilder uriBuilder= newURIBuilder(url);if (paramMap != null) {//添加请求参数
for (Entryentry : paramMap.entrySet()) {
uriBuilder.addParameter(entry.getKey(), entry.getValue());
}
}
HttpPost httpPost= newHttpPost(uriBuilder.build());if (headers != null) {//添加请求首部
for(Header header : headers) {
httpPost.addHeader(header);
}
}
httpPost.setConfig(requestConfig);//执行请求
HttpResponse response =httpClient.execute(httpPost);returnEntityUtils.toString(response.getEntity(), Charsets.UTF_8);
}/*** post请求,不带请求首部
*
*@paramurl
*@paramparamMap
*@return*@throwsException*/
public static String post(String url, MapparamMap)throwsException {return post(url, paramMap, null);
}/*** get请求
*
*@paramurl
*@paramparamMap
*@paramheaders
*@return*@throwsException*/
public static String get(String url, MapparamMap,
List headers) throwsException {
URIBuilder uriBuilder= newURIBuilder(url);if (paramMap != null) {//添加请求参数
for (Entryentry : paramMap.entrySet()) {
uriBuilder.addParameter(entry.getKey(), entry.getValue());
}
}
HttpGet httpGet= newHttpGet(uriBuilder.build());if (headers != null) {//添加请求首部
for(Header header : headers) {
httpGet.addHeader(header);
}
}
httpGet.setConfig(requestConfig);//执行请求
HttpResponse response =httpClient.execute(httpGet);returnEntityUtils.toString(response.getEntity(), Charsets.UTF_8);
}/*** get请求,不带请求首部
*
*@paramurl
*@paramparamMap
*@return*@throwsException*/
public static String get(String url, MapparamMap)throwsException {return get(url, paramMap, null);
}/*** 请求重试处理器
*@authormanzhizhen
**/
private static class MyHttpRequestRetryHandler implementsHttpRequestRetryHandler {
@Overridepublic boolean retryRequest(IOException exception, intexecutionCount,
HttpContext context) {if (executionCount >=MAX_FAIL_RETRY_COUNT) {return false;
}if (exception instanceofInterruptedIOException) {//超时
return false;
}if (exception instanceofUnknownHostException) {//未知主机
return false;
}if (exception instanceofConnectTimeoutException) {//连接被拒绝
return false;
}if (exception instanceofSSLException) {//SSL handshake exception
return false;
}
HttpClientContext clientContext=HttpClientContext.adapt(context);
HttpRequest request=clientContext.getRequest();boolean idempotent = !(request instanceofHttpEntityEnclosingRequest);if(idempotent) {//如果请求被认为是幂等的,则重试
return true;
}return false;
}
}
}