springboot整合httpClient代码实例
这篇文章主要介绍了springboot整合httpClient代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
创建httpClientConfig配置类
@Configuration @PropertySource(value="classpath:/properties/httpClient.properties") publicclassHttpClientConfig{ @Value("${http.maxTotal}") privateIntegermaxTotal;//最大连接数 @Value("${http.defaultMaxPerRoute}") privateIntegerdefaultMaxPerRoute;//最大并发链接数 @Value("${http.connectTimeout}") privateIntegerconnectTimeout;//创建链接的最大时间 @Value("${http.connectionRequestTimeout}") privateIntegerconnectionRequestTimeout;//链接获取超时时间 @Value("${http.socketTimeout}") privateIntegersocketTimeout;//数据传输最长时间 @Value("${http.staleConnectionCheckEnabled}") privatebooleanstaleConnectionCheckEnabled;//提交时检查链接是否可用 //定义httpClient链接池 @Bean(name="httpClientConnectionManager") publicPoolingHttpClientConnectionManagergetPoolingHttpClientConnectionManager(){ PoolingHttpClientConnectionManagermanager=newPoolingHttpClientConnectionManager(); manager.setMaxTotal(maxTotal);//设定最大链接数 manager.setDefaultMaxPerRoute(defaultMaxPerRoute);//设定并发链接数 returnmanager; } //定义HttpClient /** *实例化连接池,设置连接池管理器。 *这里需要以参数形式注入上面实例化的连接池管理器 @Qualifier指定bean标签进行注入 */ @Bean(name="httpClientBuilder") publicHttpClientBuildergetHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManagerhttpClientConnectionManager){ //HttpClientBuilder中的构造方法被protected修饰,所以这里不能直接使用new来实例化一个HttpClientBuilder,可以使用HttpClientBuilder提供的静态方法create()来获取HttpClientBuilder对象 HttpClientBuilderhttpClientBuilder=HttpClientBuilder.create(); httpClientBuilder.setConnectionManager(httpClientConnectionManager); returnhttpClientBuilder; } /** *注入连接池,用于获取httpClient *@paramhttpClientBuilder *@return */ @Bean publicCloseableHttpClientgetCloseableHttpClient(@Qualifier("httpClientBuilder")HttpClientBuilderhttpClientBuilder){ returnhttpClientBuilder.build(); } /** *Builder是RequestConfig的一个内部类 *通过RequestConfig的custom方法来获取到一个Builder对象 *设置builder的连接信息 *@return */ @Bean(name="builder") publicRequestConfig.BuildergetBuilder(){ RequestConfig.Builderbuilder=RequestConfig.custom(); returnbuilder.setConnectTimeout(connectTimeout) .setConnectionRequestTimeout(connectionRequestTimeout) .setSocketTimeout(socketTimeout) .setStaleConnectionCheckEnabled(staleConnectionCheckEnabled); } /** *使用builder构建一个RequestConfig对象 *@parambuilder *@return */ @Bean publicRequestConfiggetRequestConfig(@Qualifier("builder")RequestConfig.Builderbuilder){ returnbuilder.build(); } }
创建HttpClientClose关闭配置类
@Component//交给spring容器管理 publicclassHttpClientCloseextendsThread{ @Autowired privatePoolingHttpClientConnectionManagermanage; privatevolatilebooleanshutdown;//开关volatitle表示多线程可变数据,一个线程修改,其他线程立即修改 publicHttpClientClose(){ ///System.out.println("执行构造方法,实例化对象"); //线程开启启动 this.start(); } @Override publicvoidrun(){ try{ //如果服务没有关闭,执行线程 while(!shutdown){ synchronized(this){ wait(5000);//等待5秒 //System.out.println("线程开始执行,关闭超时链接"); //关闭超时的链接 PoolStatsstats=manage.getTotalStats(); intav=stats.getAvailable();//获取可用的线程数量 intpend=stats.getPending();//获取阻塞的线程数量 intlea=stats.getLeased();//获取当前正在使用的链接数量 intmax=stats.getMax(); //System.out.println("max/"+max+":av/"+av+":pend/"+pend+":lea/"+lea); manage.closeExpiredConnections(); } } }catch(Exceptione){ e.printStackTrace(); thrownewRuntimeException(); } super.run(); } //关闭清理无效连接的线程 @PreDestroy//容器关闭时执行该方法. publicvoidshutdown(){ shutdown=true; synchronized(this){ //System.out.println("关闭全部链接!!"); notifyAll();//全部从等待中唤醒.执行关闭操作; } }
编写工具类HttpClientService
@Service publicclassHttpClientService{ @Autowired privateCloseableHttpClienthttpClient; @Autowired privateRequestConfigrequestConfig; /** *通过给的url地址,获取服务器数据 *@paramurl服务器地址 *@paramparams封装用户参数 *@paramcharset设定字符编码 *@return */ publicStringdoGet(Stringurl,Mapparams,Stringcharset){ if(StringUtils.isEmpty(charset)){ charset="utf-8"; } //判断是否有参数 if(params!=null){ url+="?"; for(Map.Entry entry:params.entrySet()){ Stringkey=entry.getKey(); Stringvalue=entry.getValue(); url+=key+"="+value+"&"; } url=url.substring(0,url.length()-1); } HttpGethttpGet=newHttpGet(url); httpGet.setConfig(requestConfig); Stringresult=""; try{ CloseableHttpResponseresponse=httpClient.execute(httpGet); if(response.getStatusLine().getStatusCode()==200){ result=EntityUtils.toString(response.getEntity(),charset); } }catch(IOExceptione){ e.printStackTrace(); thrownewRuntimeException(e); } returnresult; } publicStringdoGet(Stringurl,Map params){ returndoGet(url,params,null); } publicStringdoGet(Stringurl){ returndoGet(url,null,null); } public TdoGet(Stringurl,Class tClass,Map map,StringcharSet){ Stringresult=doGet(url,map,charSet); returnObjectMapperUtil.toObject(result,tClass); } }
测试类:
@SpringBootTest @RunWith(SpringRunner.class) publicclassHttpClientTest{ @Autowired privateHttpClientServicehttpClientService; @Test publicvoidgetTest1(){ //次url是通过nginx加hosts文件映射的,需要修改url才可以使用 Stringurl="http://manage.jt.com/web/item/findItemDescById"; Mapmap=newHashMap<>(); map.put("itemId","562379"); Strings=httpClientService.doGet(url,map); System.out.println(s); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。