当前位置: 首页 > news >正文

RestTemplate动态修改请求的url

背景

在项目中有个通过线程池发送大量http请求是通过restTemplate 实现的,在研发环境需要直接连某些服务,所以需要动态修改请求的url。

自定义 ClientHttpRequestInterceptor 拦截器修改请求

自定义 ClientHttpRequestInterceptor 在请求发送前修改 URL:

public class DynamicUrlInterceptor implements ClientHttpRequestInterceptor {@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)throws IOException {URI originalUri = request.getURI();String originalUrl = originalUri.toString();String host = originalUri.getHost();// 替换服务名为 IPif (SERVICE_MAP.containsKey(host)) {String newUrl = originalUrl.replace("http://" + host, SERVICE_MAP.get(host));try {// 创建新的请求对象HttpRequest newRequest = new HttpRequestWrapper(request, new URI(newUrl));return execution.execute(newRequest, body);} catch (URISyntaxException e) {throw new IOException("Invalid URI after replacing service name", e);}}return execution.execute(request, body);}
}

注册拦截器

RestTemplateConfig 配置

public class RestTemplateConfig {private static final Logger logger = LoggerFactory.getLogger(RestTemplateConfig.class);@Autowiredprivate HttpClinetProperties httpClinetProperties;@Bean(name="httpClientTemplate")public RestTemplate restTemplate() {// 使用http连接池RestTemplate restTemplate = new RestTemplate(httpRequestFactory());//配置自定义的interceptor拦截器List<ClientHttpRequestInterceptor> interceptors=new ArrayList<ClientHttpRequestInterceptor>();interceptors.add(new DynamicUrlInterceptor());restTemplate.setInterceptors(interceptors);return restTemplate;}@Beanpublic ClientHttpRequestFactory httpRequestFactory() {return new HttpComponentsClientHttpRequestFactory(httpClient());}public HttpClient httpClient(){RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();requestConfigBuilder.setSocketTimeout(httpClinetProperties.getSocketTimeout());requestConfigBuilder.setConnectionRequestTimeout(httpClinetProperties.getConnectionRequestTimeout());requestConfigBuilder.setConnectTimeout(httpClinetProperties.getConnectTimeout());RequestConfig defaultRequestConfig = requestConfigBuilder.build();final PoolingHttpClientConnectionManager pollingConnectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);pollingConnectionManager.setMaxTotal(httpClinetProperties.getMaxTotal());pollingConnectionManager.setDefaultMaxPerRoute(httpClinetProperties.getDefaultMaxPerRoute());HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();httpClientBuilder.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy());httpClientBuilder.setConnectionManager(pollingConnectionManager);httpClientBuilder.setDefaultRequestConfig(defaultRequestConfig);HttpClient client = httpClientBuilder.build();Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {pollingConnectionManager.closeExpiredConnections();pollingConnectionManager.closeIdleConnections(5, TimeUnit.SECONDS);}}, 10 * 1000, 5 * 1000);return client;}
}
http://www.xdnf.cn/news/1104967.html

相关文章:

  • C++前缀和与差分的深度探索
  • 信号量机制
  • Python-正则表达式-信息提取-滑动窗口-数据分发-文件加载及分析器-浏览器分析-学习笔记
  • Windows GNU Radio避坑
  • 【牛客刷题】dd爱科学1.0
  • 计算机网络第三章(6)——数据链路层《网桥交换机》
  • PHT-CAD 笔记
  • 深入MyBatis:CRUD操作与高级查询实战
  • Visual Studio Code 的 settings.json 配置指南
  • K8s Service 终极解析:源码、性能、故障排查全攻略
  • 深入解析 TCP 连接状态与进程挂起、恢复与关闭
  • ROS1学习第三弹
  • Web安全 - 基于 SM2/SM4 的前后端国产加解密方案详解
  • Web安全-Linux基础-01-初识Linux
  • 牛客周赛 Round 99
  • 每日算法刷题Day45 7.11:leetcode前缀和3道题,用时1h40min
  • 浏览器重绘与重排
  • LDO选型
  • # Day31 Java方法02 方法的定义和调用
  • netdxf—— CAD c#二次开发之(netDxf 处理 DXF 文件)
  • Apache Cloudberry 向量化实践(三)重塑表达式构建路径:Gandiva 优化实战
  • Java外包怎么选?这几点不注意,项目可能血亏!
  • CompletableFuture 详解
  • ICCV2025接收论文速览(1)
  • OpenCV多种图像哈希算法的实现比较
  • 代码随想录|图论|10水流问题
  • 项目捷报 | 冠捷科技泰国工厂THA MES项目成功验收!TPV国际化布局再添里程碑!
  • 机器学习之线性回归(七)
  • 【unitrix】 4.20 类型级二进制数减法实现解析(sub.rs)
  • C++ auto与 for循环