Apache HttpClient 4.5 在Springboot中使用
ConnectionRequestTimeout
httpclient使用连接池来管理连接,这个时间就是从连接池获取连接的超时时间,可以想象下数据库连接池
ConnectTimeout
连接建立时间,三次握手完成时间
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
</dependency>
然后新建httpclient类:
在dopost中可以根据业务自定义逻辑
@Slf4j
@Service
public class HttpClientFactory {
@Autowired
HttpClientConfig httpClientConfig;
private PoolingHttpClientConnectionManager poolConnManager;
// 线程安全,所有的线程都可以使用它一起发送http请求
private CloseableHttpClient httpClient;
@PostConstruct
public void init() {
try {
log.info("init http client start, default config is {}", httpClientConfig);
SSLConnectionSocketFactory trustAll = buildSSLContext();
// 配置同时支持 HTTP 和 HTTPS
// 一个httpClient对象对于https仅会选用一个SSLConnectionSocketFactory
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().
register("http", PlainConnectionSocketFactory.getSocketFactory()).
register("https", trustAll).build();
// 初始化连接管理器
poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
poolConnManager.setMaxTotal(httpClientConfig.getPollMaxTotal());// 同时最多连接数
// 设置最大路由
poolConnManager.setDefaultMaxPerRoute(httpClientConfig.getPollMaxPeerRouter());
httpClient = getConnection();
log.info("init http client finish");
} catch (Exception e) {
log.error("", e);
}
}
public CloseableHttpClient getConnection() {
RequestConfig config = RequestConfig.custom().setConnectTimeout(httpClientConfig.getConnectTimeout())
.setConnectionRequestTimeout(httpClientConfig.getConnectionRequestTimeout())
.setSocketTimeout(httpClientConfig.getResponseTimeout())
.build();
return HttpClients.custom()
// 设置连接池管理
.setConnectionManager(poolConnManager)
.setDefaultRequestConfig(config).build();
}
public String doGet(String url) {
return this.doGet(url, Collections.EMPTY_MAP, Collections.EMPTY_MAP);
}
public String doGet(String url, Map<String, Object> params) {
return this.doGet(url, Collections.EMPTY_MAP, params);
}
public String doGet(String url, Map<String, String> headers, Map<String, Object> params) {
// *) 构建GET请求头
String apiUrl = getUrlWithParams(url, params);
HttpGet httpGet = new HttpGet(apiUrl);
// *) 设置header信息
if (headers != null && headers.size() > 0) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
httpGet.addHeader(entry.getKey(), entry.getValue());
}
}
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
if (response == null || response.getStatusLine() == null) {
return null;
}
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity entityRes = response.getEntity();
if (entityRes != null) {
return EntityUtils.toString(entityRes, "UTF-8");
}
}
return null;
} catch (IOException e) {
log.error("", e);
}
return null;
}
public HttpServerResponseDTO doPost(String apiUrl, String body, int connectionTimeOut, Integer contentTypeEnum, String pemBody) {
return doPost(apiUrl, Collections.EMPTY_MAP, body, connectionTimeOut, contentTypeEnum);
}
public HttpServerResponseDTO doPost(String apiUrl, Map<String, String> headers, String body,Integer contentTypeEnum) {
CloseableHttpClient currentHttpClient = httpClient;
HttpPost httpPost = new HttpPost(apiUrl);
// *) 配置请求headers
if (headers != null && headers.size() > 0) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
httpPost.addHeader(entry.getKey(), entry.getValue());
}
}
ContentTypeEnum contentType = ContentTypeEnum.getDataSourceEnum(contentTypeEnum);
// *) 配置请求参数
httpPost.setEntity(new StringEntity(body, ContentType.create(contentType.getDesc(), Consts.UTF_8)));
httpPost.setConfig(buildRequestConfig());
try (CloseableHttpResponse response = currentHttpClient.execute(httpPost)) {
if (response == null || response.getStatusLine() == null) {
return HttpServerResponseDTO.builder()
.statusCode(Constants.HTTP_CLIENT_ERROR)
.build();
}
HttpEntity httpEntity = response.getEntity();
String contentTypeString = httpEntity.getContentType() == null ? null : httpEntity.getContentType().getValue();
String connection = getHeaderValue(response, "Connection");
String server = getHeaderValue(response, "Server");
String date = getHeaderValue(response, "Date");
String pragma = getHeaderValue(response, "pragma");
return HttpServerResponseDTO.builder()
.statusCode(response.getStatusLine().getStatusCode())
.body(EntityUtils.toString(response.getEntity(), UTF_8))
.contentType(contentTypeString)
.connection(connection)
.server(server)
.date(date)
.pragma(pragma)
.build();
} catch (IOException e) {
log.error("", e);
return HttpServerResponseDTO.builder().statusCode(Constants.HTTP_CLIENT_ERROR).statusMessage(e.getMessage()).build();
}
}
private String getUrlWithParams(String url, Map<String, Object> params) {
boolean first = true;
StringBuilder sb = new StringBuilder(url);
for (String key : params.keySet()) {
char ch = '&';
if (first) {
ch = '?';
first = false;
}
String value = params.get(key).toString();
try {
String sval = URLEncoder.encode(value, "UTF-8");
sb.append(ch).append(key).append("=").append(sval);
} catch (UnsupportedEncodingException e) {
log.error("", e);
}
}
return sb.toString();
}
public SSLConnectionSocketFactory buildSSLContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, KeyManagementException {
SSLContext sslcontext = SSLContexts.custom()
//忽略掉对服务器端证书的校验
.loadTrustMaterial((TrustStrategy) (chain, authType) -> true)
.build();
return new SSLConnectionSocketFactory(
sslcontext,
new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"},
null,
NoopHostnameVerifier.INSTANCE);
}
private RequestConfig buildRequestConfig() {
int connectionOut = httpClientConfig.getConnectTimeout();
return RequestConfig.custom().setConnectTimeout(connectionOut)
.setConnectionRequestTimeout(httpClientConfig.getConnectionRequestTimeout())
.setSocketTimeout(connectionOut)
.build();
}
private String getHeaderValue(CloseableHttpResponse response, String key) {
return response.getFirstHeader(key) == null ?
null : response.getFirstHeader(key).getValue();
}
}
调用方式:
@Autowired
HttpClientFactory httpClientFactory;
HttpServerResponseDTO httpServerResponseDTO = httpClientFactory.doPost(url, headersMap, body, httpConfigEntity.getContentType(), httpConfigEntity.getTls());
Apache HttpClient 4.5 在Springboot中使用的更多相关文章
- 在android 6.0(API 23)中,Google已经移除了移除了Apache HttpClient相关的类
推荐使用HttpUrlConnection,如果要继续使用需要Apache HttpClient,需要在eclipse下libs里添加org.apache.http.legacy.jar,androi ...
- android 中对apache httpclient及httpurlconnection的选择
在官方blog中,android工程师谈到了如何去选择apache client和httpurlconnection的问题: 原文见http://android-developers.blogspot ...
- 如何在Apache HttpClient中设置TLS版本
1.简介 Apache HttpClient是一个底层.轻量级的客户端HTTP库,用于与HTTP服务器进行通信. 在本教程中,我们将学习如何在使用HttpClient时配置支持的传输层安全(TLS)版 ...
- springboot 中使用Druid 数据源提供数据库监控
一.springboot 中注册 Servlet/Filter/Listener 的方式有两种,1 通过代码注册 ServletRegistrationBean. FilterRegistration ...
- 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧
做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...
- Apache HttpClient使用之阻塞陷阱
前言: 之前做个一个数据同步的定时程序. 其内部集成了某电商的SDK(简单的Apache Httpclient4.x封装)+Spring Quartz来实现. 原本以为简单轻松, 喝杯咖啡就高枕无忧的 ...
- Android 6.0删除Apache HttpClient相关类的解决方法
相应的官方文档如下: 上面文档的大致意思是,在Android 6.0(API 23)中,Google已经移除了Apache HttpClient相关的类,推荐使用HttpUrlConnection. ...
- spring-boot+mybatis开发实战:如何在spring-boot中使用myabtis持久层框架
前言: 本项目基于maven构建,使用mybatis-spring-boot作为spring-boot项目的持久层框架 spring-boot中使用mybatis持久层框架与原spring项目使用方式 ...
- 新旧apache HttpClient 获取httpClient方法
在apache httpclient 4.3版本中对很多旧的类进行了deprecated标注,通常比较常用的就是下面两个类了. DefaultHttpClient -> CloseableHtt ...
随机推荐
- android Studio(3.1) 常用快捷键
说 明 快捷键 全部保存 Ctrl + S 最大话/最小化编辑器 Ctrl + Shift + F12 搜索内容(包括代码和菜单) 按两次Shift 查找 Ctrl + F 查找下一个 F3 查找上 ...
- 【jmespath】—2. 进阶 List and Slice Projections
Projections翻译的话说实话我也不知道翻成什么比较准确,姑且就叫"投影"吧,不过带来的功能确实非常的强大.好用. 首先,我先说下我的理解: 通配符 * 通配符生成的是一个l ...
- webpack3.10.0(入门系列基本概念1)
一.概念 webpack的核心是一个用于现代JavaScript应用程序的静态模块打包程序.当webpack处理您的应用程序时,它会递归地构建一个依赖图,其中包含应用程序所需的每个模块,然后将所有这些 ...
- Linux(CentOS7)安装Tomcat (Tomcat+JDK)
安装Tomcat首先要安装jdk,jdk和tomcat安装可以使用的方法:将jdk.tomcat上传到Linux,然后解压后使用,另一种方法是直接使用在线安装:yum 第一步:安装jdk,在Linux ...
- Oracle数据库之表与表数据操作
一.SQL语言 SQL语言分为四种,分别是:数据定义语言(DDL).数据操纵语言(DCL).事务控制语言(TCL).数据控制语言(DML). 1.1 数据定义语言(DDL) 建立.修改.删除数据库对象 ...
- oracle数据处理之expdb/impdb
Oracle 数据泵的使用方法 一.新建逻辑目录 最好以system等管理员创建逻辑目录,Oracle不会自动创建实际的物理目录“D:\oracleData”(务必手动创建此目录),仅仅是进行定义逻辑 ...
- Oracle闪回flashback
参考资料:Using Oracle Flashback Technology Oracle 11g的新特性闪回操作 闪回查询 闪回查询 闪回版本查询 闪回事务查询 闪回数据 闪回表 闪回删除 闪回数据 ...
- 使用wordpress搭建的一个微信小程序
- MySQL For Linux(CentOS/Ubuntu/Debian/Fedora/Arch)一键安装脚本(5.1-8.0)
简介 很多童鞋不懂这么在Linux系统安装MySQL,网上大多数教程较复杂,不太适合小白安装,本教程提供一键安装脚本供大家使用,教大家怎么在Linux操作系统( 支持CentOS/Ubuntu/Deb ...
- URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇
Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...