发送Http请求的HttpClientUtil工具
代码如下:
/**
* @author xuan
* @create 2023/11/6
*/
public class HttpUtil {
// 创建连接池管理器
private static final PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager();
// http客户端
private static CloseableHttpClient httpClient;
static {
//连接池最大连接数
connMgr.setMaxTotal(200);
//每个路由的最大连接数
connMgr.setDefaultMaxPerRoute(20);
//连接的过期时间
connMgr.setValidateAfterInactivity(1000*60);
}
public static void post(String url, Map<String, String> params) {
//这里之所以有两个检查是否为null的语句,主要是支持高并发的,比如现在一次性的有很多个请求过来,首先这些请求先判断第一个if,发现httpClient == null
//是成立的,接着这些请求就会跑到synchronized关键字的上面,然后因为同步原因,第一个请求会先进去,进去之后发现httpClinet == null仍然是成立的,接着
//当前请求就去给httpClient赋值;然后当前请求走出代码同步块,接着第二个请求会进去,发现httpClient已经不等于空了,所以就不会重新给httpClient进行赋值了,
//因此第二个null是很有必要写的,可以提升代码的效率
if(httpClient == null) {
synchronized(HttpUtil.class) {
if(httpClient == null) {
httpClient = HttpClients.custom().setConnectionManager(connMgr).build();
}
}
}
//创建Post请求
HttpPost httpPost = new HttpPost(url);
//设置参数
List<NameValuePair> formParams = new ArrayList<>();
for(Map.Entry<String, String> entry : params.entrySet()) {
String name = entry.getKey();
String value = entry.getValue();
formParams.add(new BasicNameValuePair(name, value));
}
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, StandardCharsets.UTF_8);
httpPost.setEntity(entity);
try {
CloseableHttpResponse response = httpClient.execute(httpPost);
System.out.println(response);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
httpPost.releaseConnection();
}
}
public static void main(String[] args) {
Map<String, String> params = new HashMap<>();
params.put("rid", "666");
params.put("level", "666");
params.put("content", "666");
params.put("server", "666");
params.put("logType", "666");
params.put("sid", "666");
params.put("time", new Date().getTime() + "");
HttpUtil.post("http://192.168.10.232:9898/addOne", params);
}
}
注意这里有一个http请求连接池,功能和数据库连接池的功能差不多,都是用来提高连接效率的。如下图:
使用http请求连接池,可以把一些http连接放到池子里面,这样我们就不用频繁的进行http连接和断开http连接了,需要的时候直接去连接池里面去拿,用完之后就放回到池子里面。
为什么频繁的进行http连接和断开http连接消耗性能呢?
- 避免反复的三次握手和四次握手。长连接的建立需要进行三次握手,而连接的释放需要进行四次握手,这是发生在系统层面的两个动作,对于单条连接来说耗时微乎其微,但在高吞吐场景时,耗时则不能忽略。
执行main方法,如下图:
返回的状态码是200,插入成功!