Http连接池实现
依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
实现:
以单列模式创建,初始化连接池,设定连接数量。
@Slf4j
public class HttpClientUtil {
// PoolingHttpClientConnectionManager是通过租用连接和收回链接的方式来实现的。解决了http请求的多线程问题。
private static PoolingHttpClientConnectionManager connectionManager;
private static String EMPTY_STR = "";
private static String UTF_8 = "UTF-8";
private static void init() {
if (connectionManager == null) {
connectionManager = new PoolingHttpClientConnectionManager();
// 整个连接池最大连接数
connectionManager.setMaxTotal(100);
// 每路由最大连接数,默认值是2
connectionManager.setDefaultMaxPerRoute(5);
}
}
/**
* 通过连接池获取HttpClient
*
* @return
*/
private static CloseableHttpClient getHttpClient() {
init();
return HttpClients.custom().setConnectionManager(connectionManager).build();
}
/**
* url 中可以传参
*
* @param url
* @return
*/
public static String httpGetRequest(String url) {
HttpGet httpGet = new HttpGet(url);
return getResult(httpGet);
}
/**
* get 请求,自定义参数
*
* @param url
* @param params
* @return
* @throws URISyntaxException
*/
public static String httpGetRequest(String url, Map<String, Object> params) throws URISyntaxException {
URIBuilder ub = new URIBuilder(url);
ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
ub.setParameters(pairs);
HttpGet httpGet = new HttpGet(ub.build());
return getResult(httpGet);
}
/**
* get 请求,自定义参数、自定义 header
*
* @param url
* @param headers
* @param params
* @return
* @throws URISyntaxException
*/
public static String httpGetRequest(String url, Map<String, Object> headers, Map<String, Object> params)
throws URISyntaxException {
URIBuilder ub = new URIBuilder();
ub.setPath(url);
ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
ub.setParameters(pairs);
HttpGet httpGet = new HttpGet(ub.build());
for (Map.Entry<String, Object> param : headers.entrySet()) {
httpGet.addHeader(param.getKey(), String.valueOf(param.getValue()));
}
return getResult(httpGet);
}
/**
* 无参 post 请求
*
* @param url
* @return
*/
public static String httpPostRequest(String url) {
HttpPost httpPost = new HttpPost(url);
return getResult(httpPost);
}
/**
* post 请求, body 为 json
*
* @param url
* @param jsonBody
* @return
*/
public static String httpPostRequest(String url, String jsonBody, Map<String, Object> headers) {
HttpPost httpPost = new HttpPost(url);
if (MapUtils.isNotEmpty(headers)) {
for (Map.Entry<String, Object> param : headers.entrySet()) {
httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));
}
}
StringEntity entity = new StringEntity(jsonBody, "utf-8");//解决中文乱码问题
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
return getResult(httpPost);
}
/**
* post 请求,body 部分进行了 url 编码
*
* @param url
* @param params
* @return
* @throws UnsupportedEncodingException
*/
public static String httpPostRequest(String url, Map<String, Object> params) throws UnsupportedEncodingException {
HttpPost httpPost = new HttpPost(url);
ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
httpPost.setEntity(new UrlEncodedFormEntity(pairs, UTF_8));
return getResult(httpPost);
}
/**
* post 请求,body 部分进行了 url 编码、自定义 header
*
* @param url
* @param headers
* @param params
* @return
* @throws UnsupportedEncodingException
*/
public static String httpPostRequest(String url, Map<String, Object> headers, Map<String, Object> params)
throws UnsupportedEncodingException {
HttpPost httpPost = new HttpPost(url);
for (Map.Entry<String, Object> param : headers.entrySet()) {
httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));
}
ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
httpPost.setEntity(new UrlEncodedFormEntity(pairs, UTF_8));
return getResult(httpPost);
}
private static ArrayList<NameValuePair> covertParams2NVPS(Map<String, Object> params) {
ArrayList<NameValuePair> pairs = new ArrayList<>();
for (Map.Entry<String, Object> param : params.entrySet()) {
pairs.add(new BasicNameValuePair(param.getKey(), String.valueOf(param.getValue())));
}
return pairs;
}
/**
* 处理Http请求,返回值统一使用 String 格式,调用方根据需要转为 Json -> Object
*
* @param request
* @return
*/
private static String getResult(HttpRequestBase request) {
CloseableHttpClient httpClient = getHttpClient();
try {
CloseableHttpResponse response = httpClient.execute(request);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
if (entity != null) {
// long len = entity.getContentLength();// -1 表示长度未知
String result = EntityUtils.toString(entity);
response.close();
// httpClient.close();
return result;
}
} else {
log.info("请求失败,url = {}, response_code = {}, reason = {}", request.getURI(), statusCode, statusLine.getReasonPhrase());
throw new BizException(ErrorCodeEnum.HTTP_CLIENT_ERROR);
}
} catch (IOException e) {
log.info("请求失败,url = {}", request.getURI(), e);
}
return EMPTY_STR;
}
public static void main(String[] args) {
System.out.println(HttpClientUtil.httpGetRequest("http://14.xxx.xxx.39"));
System.out.println(HttpClientUtil.httpPostRequest("http://localhost:8000/tracking/alert/application/meta/list"));
}
}