spring boot 整合 HttpClient
2019-04-30 23:40:37来源:博客园 阅读 ()
第一步:引入HttpClient 的jar包
1、httpClient 5.0 开始支持异步(Async)请求;
2、httpclient 版本过低上传文件会出,原因是 org.apache.http.entity.ContentType 没有方法 withParameters(final NameValuePair... params);
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <!-- httpClient文件上传需要 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> </dependency>
第二步:创建一个httpClient的配置类
1 package com.123.lenovo.adapter.se.config; 2 3 import java.security.KeyStore; 4 import javax.net.ssl.SSLContext; 5 6 import org.apache.http.HeaderElement; 7 import org.apache.http.HeaderElementIterator; 8 import org.apache.http.HttpResponse; 9 import org.apache.http.client.config.RequestConfig; 10 import org.apache.http.conn.ConnectionKeepAliveStrategy; 11 import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 12 import org.apache.http.conn.ssl.TrustAllStrategy; 13 import org.apache.http.impl.client.CloseableHttpClient; 14 import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; 15 import org.apache.http.impl.client.HttpClientBuilder; 16 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 17 import org.apache.http.message.BasicHeaderElementIterator; 18 import org.apache.http.protocol.HTTP; 19 import org.apache.http.protocol.HttpContext; 20 import org.apache.http.ssl.SSLContexts; 21 import org.elasticsearch.Build; 22 import org.springframework.beans.factory.annotation.Value; 23 import org.springframework.context.annotation.Bean; 24 import org.springframework.context.annotation.Configuration; 25 26 import com.123.lenovo.adapter.se.common.IdleConnectionEvictor; 27 28 @Configuration 29 public class HttpClientConfig { 30 31 @Value("${http_max_total}") 32 private int maxTotal = 800; 33 34 @Value("${http_default_max_perRoute}") 35 private int defaultMaxPerRoute = 80; 36 37 @Value("${http_validate_after_inactivity}") 38 private int validateAfterInactivity = 1000; 39 40 @Value("${http_connection_request_timeout}") 41 private int connectionRequestTimeout = 5000; 42 43 @Value("${http_connection_timeout}") 44 private int connectTimeout = 10000; 45 46 @Value("${http_socket_timeout}") 47 private int socketTimeout = 20000; 48 49 @Value("${waitTime}") 50 private int waitTime = 30000; 51 52 @Value("${idleConTime}") 53 private int idleConTime = 3; 54 55 @Value("${retryCount}") 56 private int retryCount = 3; 57 58 @Bean 59 public PoolingHttpClientConnectionManager createPoolingHttpClientConnectionManager() { 60 PoolingHttpClientConnectionManager poolmanager = new PoolingHttpClientConnectionManager(); 61 poolmanager.setMaxTotal(maxTotal); 62 poolmanager.setDefaultMaxPerRoute(defaultMaxPerRoute); 63 poolmanager.setValidateAfterInactivity(validateAfterInactivity); 64 return poolmanager; 65 } 66 67 @Bean 68 public CloseableHttpClient createHttpClient(PoolingHttpClientConnectionManager poolManager) { 69 HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().setConnectionManager(poolManager); 70 httpClientBuilder.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() { 71 72 @Override 73 public long getKeepAliveDuration(HttpResponse response, HttpContext context) { 74 HeaderElementIterator iterator = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE)); 75 while (iterator.hasNext()) { 76 HeaderElement headerElement = iterator.nextElement(); 77 String param = headerElement.getName(); 78 String value = headerElement.getValue(); 79 if (null != value && param.equalsIgnoreCase("timeout")) { 80 return Long.parseLong(value) * 1000; 81 } 82 } 83 return 30 * 1000; 84 } 85 }); 86 httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(retryCount, false)); 87 return httpClientBuilder.build(); 88 }102 103 @Bean 104 public RequestConfig createRequestConfig() { 105 return RequestConfig.custom() 106 .setConnectionRequestTimeout(connectionRequestTimeout) // 从连接池中取连接的超时时间 107 .setConnectTimeout(connectTimeout) // 连接超时时间 108 .setSocketTimeout(socketTimeout) // 请求超时时间 109 .build(); 110 } 111 112 @Bean 113 public IdleConnectionEvictor createIdleConnectionEvictor(PoolingHttpClientConnectionManager poolManager) { 114 IdleConnectionEvictor idleConnectionEvictor = new IdleConnectionEvictor(poolManager, waitTime, idleConTime); 115 return idleConnectionEvictor; 116 } 117 118 }
第三步:创建httpClient的工具类
1 @Component 2 public class HttpClientHelper { 3 4 private Logger LOGGER = LoggerFactory.getLogger(HttpClientHelper.class); 5 6 @Autowired 7 private CloseableHttpClient httpClient; 8 9 @Autowired 10 private RequestConfig requestConfig; 11 12 public String get(String url, HashMap<String, Object> paramMap, HashMap<String, Object> header) { 13 String result = null; 14 if ("".equals(url)) { 15 return result; 16 } 17 // 创建一个request对象 18 HttpGet httpGet = new HttpGet(url); 19 CloseableHttpResponse response = null; 20 try { 21 // 配置连接参数 22 httpGet.setConfig(requestConfig); 23 //设置参数 24 if (paramMap != null && paramMap.size() > 0) { 25 List<NameValuePair> params = new ArrayList<>(); 26 for (Entry<String, Object> entry : paramMap.entrySet()) { 27 params.add(new BasicNameValuePair(entry.getKey(), URLEncoder.encode(entry.getValue().toString(), "UTF-8"))); 28 } 29 String strParams = EntityUtils.toString(new UrlEncodedFormEntity(params)); 30 // 防止多参数时,分隔符","被转义 31 String realParams = URLDecoder.decode(strParams, "UTF-8"); 32 httpGet.setURI(new URI(httpGet.getURI().toString().indexOf("?") > 0 ? httpGet.getURI().toString() + "&" + realParams : httpGet.getURI().toString() + "?" + realParams)); 33 } 34 // 设置头 35 if (header != null && header.size() > 0) { 36 for (Entry<String, Object> entry : header.entrySet()) { 37 httpGet.addHeader(entry.getKey(), entry.getValue().toString()); 38 } 39 } 40 // 执行request请求 41 response = httpClient.execute(httpGet); 42 result = parseResponse(response); 43 44 } catch (Exception e) { 45 LOGGER.error("url : "+ url +", msg : " + e.getMessage()); 46 httpGet.abort(); 47 } finally { 48 try { 49 if (response != null) { 50 response.close(); 51 } 52 } catch (IOException e) { 53 e.printStackTrace(); 54 } 55 } 56 return result; 57 } 58 59 public String post(String url, HashMap<String, Object> paramMap, HashMap<String, Object> header) { 60 String result = null; 61 if ("".equals(url)) { 62 return result; 63 } 64 // 创建一个request对象 65 HttpPost httpPost = new HttpPost(url); 66 CloseableHttpResponse response = null; 67 try { 68 // 配置连接参数 69 httpPost.setConfig(requestConfig); 70 // 设置参数 71 if (paramMap != null && paramMap.size() > 0) { 72 List<NameValuePair> params = new ArrayList<>(); 73 for (Entry<String, Object> entry : paramMap.entrySet()) { 74 params.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString())); 75 } 76 HttpEntity entity = new UrlEncodedFormEntity(params); 77 httpPost.setEntity(entity); 78 } 79 // 设置头 80 if (header != null && header.size() > 0) { 81 for (Entry<String, Object> entry : header.entrySet()) { 82 httpPost.addHeader(entry.getKey(), entry.getValue().toString()); 83 } 84 } 85 // 执行request请求 86 response = httpClient.execute(httpPost); 87 result = reponseHandle(response); 88 } catch (Exception e) { 89 LOGGER.error("url : "+ url +", msg : " + e.getMessage()); 90 httpPost.abort(); 91 } finally { 92 try { 93 if (response != null) { 94 response.close(); 95 } 96 } catch (IOException e) { 97 e.printStackTrace(); 98 } 99 } 100 return result; 101 } 102 103 public String postJSON(String url, String json_str, HashMap<String, Object> header) { 104 String result = null; 105 if ("".equals(url)) { 106 return result; 107 } 108 // 创建一个request对象 109 HttpPost httpPost = new HttpPost(url); 110 CloseableHttpResponse response = null; 111 try { 112 // 配置连接参数 113 httpPost.setConfig(requestConfig); 114 // 设置参数 115 if (json_str != null && !"".equals(json_str)) { 116 StringEntity entity = new StringEntity(json_str, ContentType.APPLICATION_JSON); 117 entity.setContentEncoding("UTF-8"); 118 entity.setContentType("application/json"); 119 httpPost.setEntity(entity); 120 } 121 // 设置头 122 if (header != null && header.size() > 0) { 123 for (Entry<String, Object> entry : header.entrySet()) { 124 httpPost.addHeader(entry.getKey(), entry.getValue().toString()); 125 } 126 } 127 // 执行request请求 128 response = httpClient.execute(httpPost); 129 result = reponseHandle(response); 130 131 } catch (Exception e) { 132 LOGGER.error("url : "+ url +", msg : " + e.getMessage()+", param : " +json_str); 133 httpPost.abort(); 134 } finally { 135 try { 136 if (response != null) { 137 response.close(); 138 } 139 } catch (IOException e) { 140 e.printStackTrace(); 141 } 142 } 143 return result; 144 } 145 146 public String uploadFile(String url, String filePath, String fileParam, Map<String, Object> params) { 147 File file = new File(filePath); 148 if (!(file.exists() && file.isFile())) { 149 throw new RuntimeException("file : file is null"); 150 } 151 String result = null; 152 if ("".equals(url)) { 153 return result; 154 } 155 // 创建一个request对象 156 HttpPost httpPost = new HttpPost(url); 157 CloseableHttpResponse response = null; 158 try { 159 // 配置连接参数 160 httpPost.setConfig(requestConfig); 161 MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 162 builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 163 builder.addBinaryBody(fileParam, file, ContentType.DEFAULT_BINARY, file.getName()); 164 if (params != null && params.size() > 0) { 165 for (Entry<String, Object> entry : params.entrySet()) { 166 builder.addTextBody(entry.getKey(), entry.getValue().toString(), ContentType.create("text/plain", Consts.UTF_8)); 167 } 168 } 169 HttpEntity requestEntity = builder.build(); 170 httpPost.setEntity(requestEntity); 171 // 执行request请求 172 response = httpClient.execute(httpPost); 173 result = reponseHandle(response); 174 175 } catch (Exception e) { 176 httpPost.abort(); 177 } finally { 178 try { 179 if (response != null) { 180 response.close(); 181 } 182 } catch (IOException e) { 183 e.printStackTrace(); 184 } 185 } 186 return result; 187 } 188 189 /** 190 * 解析 response数据 191 * @description 192 * @param response 193 * @return 194 * @author tangjingjing 195 * @date 2018年10月12日 196 */ 197 private String parseResponse(CloseableHttpResponse response) { 198 String result = ""; 199 // 获取响应体 200 HttpEntity httpEntity = null; 201 InputStream inputStream = null; 202 try { 203 // 获取响应状态 204 int statusCode = response.getStatusLine().getStatusCode(); 205 // 没有正常响应 206 if (statusCode < HttpStatus.SC_OK || statusCode >= HttpStatus.SC_MULTIPLE_CHOICES) { 207 throw new RuntimeException("statusCode : " + statusCode); 208 } 209 // 获取响应体 210 httpEntity = response.getEntity(); 211 if (httpEntity != null) { 212 inputStream = httpEntity.getContent(); 213 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8")); 214 StringBuffer sb = new StringBuffer(); 215 String line = ""; 216 while((line=reader.readLine())!=null){ 217 sb.append(line); 218 } 219 reader.close(); 220 result = sb.toString(); 221 } 222 223 } catch (Exception e) { 224 LOGGER.error("HttpClientHelper parseResponse error", e); 225 } finally { 226 if (inputStream != null) { 227 try { 228 inputStream.close(); 229 } catch (IOException e) { 230 e.printStackTrace(); 231 } 232 } 233 // 如果httpEntity没有被完全消耗,那么连接无法安全重复使用,将被关闭并丢弃 234 try { 235 EntityUtils.consume(httpEntity); 236 } catch (IOException e) { 237 e.printStackTrace(); 238 } 239 } 240 return result; 241 } 242 243 private String reponseHandle(CloseableHttpResponse response) { 244 String result = ""; 245 // 获取响应体 246 HttpEntity httpEntity = null; 247 try { 248 // 获取响应状态 249 int statusCode = response.getStatusLine().getStatusCode(); 250 // 没有正常响应 251 if (statusCode < HttpStatus.SC_OK || statusCode >= HttpStatus.SC_MULTIPLE_CHOICES) { 252 throw new RuntimeException("statusCode : " + statusCode); 253 } 254 // 获取响应体 255 httpEntity = response.getEntity(); 256 if (httpEntity !=null) { 257 result = EntityUtils.toString(httpEntity); 258 } 259 260 } catch (Exception e) { 261 LOGGER.error("HttpClientHelper reponseHandle error", e); 262 } finally { 263 // 如果httpEntity没有被完全消耗,那么连接无法安全重复使用,将被关闭并丢弃 264 try { 265 EntityUtils.consume(httpEntity); 266 } catch (IOException e) { 267 e.printStackTrace(); 268 } 269 } 270 return result; 271 } 272 273 }
第四步:创建HttpClient无效连接清除类
1 /** 2 * 定期清理无效的http连接 3 * @author viruser 4 * 5 */ 6 package com.123.lenovo.adapter.se.common; 7 8 import java.util.concurrent.TimeUnit; 9 10 import javax.annotation.PreDestroy; 11 12 import org.apache.http.conn.HttpClientConnectionManager; 13 14 /** 15 * 定期清理无效的http连接 16 * @author viruser 17 * 18 */ 19 public class IdleConnectionEvictor extends Thread { 20 21 private final HttpClientConnectionManager manager; 22 23 private Integer waitTime; 24 25 private Integer idleConTime; 26 27 private volatile boolean shutdown = true; 28 29 public IdleConnectionEvictor(HttpClientConnectionManager manager, Integer waitTime, Integer idleConTime) { 30 this.manager = manager; 31 this.waitTime = waitTime; 32 this.idleConTime = idleConTime; 33 this.start(); 34 } 35 36 @Override 37 public void run() { 38 try { 39 if (shutdown) { 40 synchronized (this) { 41 wait(waitTime); 42 manager.closeIdleConnections(idleConTime, TimeUnit.SECONDS); 43 // 关闭失效的连接 44 manager.closeExpiredConnections(); 45 } 46 } 47 } catch (Exception e) { 48 49 } 50 } 51 52 @PreDestroy 53 public void shutdown() { 54 shutdown = false; 55 synchronized (this) { 56 notifyAll(); 57 } 58 } 59 60 }
原文链接:https://www.cnblogs.com/super-jing/p/10794564.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:6.JAVA-链表实例
下一篇:网站的可扩性展架构
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash