springboot整合httpClient代码实例

时间:2021-05-19

这篇文章主要介绍了springboot整合httpClient代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

创建httpClientConfig配置类

@Configuration@PropertySource(value="classpath:/properties/httpClient.properties")public class HttpClientConfig { @Value("${http.maxTotal}") private Integer maxTotal; //最大连接数 @Value("${http.defaultMaxPerRoute}") private Integer defaultMaxPerRoute; //最大并发链接数 @Value("${http.connectTimeout}") private Integer connectTimeout; //创建链接的最大时间 @Value("${http.connectionRequestTimeout}") private Integer connectionRequestTimeout; //链接获取超时时间 @Value("${http.socketTimeout}") private Integer socketTimeout; //数据传输最长时间 @Value("${http.staleConnectionCheckEnabled}") private boolean staleConnectionCheckEnabled; //提交时检查链接是否可用 //定义httpClient链接池 @Bean(name="httpClientConnectionManager") public PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() { PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(); manager.setMaxTotal(maxTotal); //设定最大链接数 manager.setDefaultMaxPerRoute(defaultMaxPerRoute); //设定并发链接数 return manager; } //定义HttpClient /** * 实例化连接池,设置连接池管理器。 * 这里需要以参数形式注入上面实例化的连接池管理器 @Qualifier 指定bean标签进行注入 */ @Bean(name = "httpClientBuilder") public HttpClientBuilder getHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManager httpClientConnectionManager){ //HttpClientBuilder中的构造方法被protected修饰,所以这里不能直接使用new来实例化一个HttpClientBuilder,可以使用HttpClientBuilder提供的静态方法create()来获取HttpClientBuilder对象 HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); httpClientBuilder.setConnectionManager(httpClientConnectionManager); return httpClientBuilder; } /** * 注入连接池,用于获取httpClient * @param httpClientBuilder * @return */ @Bean public CloseableHttpClient getCloseableHttpClient(@Qualifier("httpClientBuilder") HttpClientBuilder httpClientBuilder){ return httpClientBuilder.build(); } /** * Builder是RequestConfig的一个内部类 * 通过RequestConfig的custom方法来获取到一个Builder对象 * 设置builder的连接信息 * @return */ @Bean(name = "builder") public RequestConfig.Builder getBuilder(){ RequestConfig.Builder builder = RequestConfig.custom(); return builder.setConnectTimeout(connectTimeout) .setConnectionRequestTimeout(connectionRequestTimeout) .setSocketTimeout(socketTimeout) .setStaleConnectionCheckEnabled(staleConnectionCheckEnabled); } /** * 使用builder构建一个RequestConfig对象 * @param builder * @return */ @Bean public RequestConfig getRequestConfig(@Qualifier("builder") RequestConfig.Builder builder){ return builder.build(); }}

创建HttpClientClose关闭配置类

@Component //交给spring容器管理public class HttpClientClose extends Thread{ @Autowired private PoolingHttpClientConnectionManager manage; private volatile boolean shutdown; //开关 volatitle表示多线程可变数据,一个线程修改,其他线程立即修改 public HttpClientClose() { ///System.out.println("执行构造方法,实例化对象"); //线程开启启动 this.start(); } @Override public void run() { try { //如果服务没有关闭,执行线程 while(!shutdown) { synchronized (this) { wait(5000); //等待5秒 //System.out.println("线程开始执行,关闭超时链接"); //关闭超时的链接 PoolStats stats = manage.getTotalStats(); int av = stats.getAvailable(); //获取可用的线程数量 int pend = stats.getPending(); //获取阻塞的线程数量 int lea = stats.getLeased(); //获取当前正在使用的链接数量 int max = stats.getMax(); //System.out.println("max/"+max+": av/"+av+": pend/"+pend+": lea/"+lea); manage.closeExpiredConnections(); } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } super.run(); } //关闭清理无效连接的线程 @PreDestroy //容器关闭时执行该方法. public void shutdown() { shutdown = true; synchronized (this) { //System.out.println("关闭全部链接!!"); notifyAll(); //全部从等待中唤醒.执行关闭操作; } }

编写工具类HttpClientService

@Servicepublic class HttpClientService { @Autowired private CloseableHttpClient httpClient; @Autowired private RequestConfig requestConfig; /** * 通过给的url地址,获取服务器数据 * @param url 服务器地址 * @param params 封装用户参数 * @param charset 设定字符编码 * @return */ public String doGet(String url, Map<String,String> params,String charset) { if (StringUtils.isEmpty(charset)) { charset = "utf-8"; } //判断是否有参数 if (params != null) { url +="?"; for (Map.Entry<String,String> entry: params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); url += key +"="+value+"&"; } url = url.substring(0,url.length() - 1); } HttpGet httpGet = new HttpGet(url); httpGet.setConfig(requestConfig); String result = ""; try { CloseableHttpResponse response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(response.getEntity(),charset); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } return result; } public String doGet(String url, Map<String,String> params) { return doGet(url,params,null); } public String doGet(String url) { return doGet(url,null,null); } public <T> T doGet(String url,Class<T> tClass,Map<String,String> map, String charSet){ String result = doGet(url,map,charSet); return ObjectMapperUtil.toObject(result, tClass); }}

测试类:

@SpringBootTest@RunWith(SpringRunner.class)public class HttpClientTest {@Autowiredprivate HttpClientService httpClientService; @Test public void getTest1() {    //次url是通过nginx加hosts文件映射的,需要修改url才可以使用 String url = "http://manage.jt.com/web/item/findItemDescById"; Map<String,String> map = new HashMap<>(); map.put("itemId","562379"); String s = httpClientService.doGet(url, map); System.out.println(s); }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章