Spring 6 HttpExchanges动态设置Base URL路径覆盖问题求助
解决Spring 6 HttpExchanges动态设置Base URL的问题
方法一:使用Spring 6.1+提供的@UriVariable注解
Spring 6.1及以上版本新增了@UriVariable注解,专门用于动态拼接基础URI和接口路径,不会对完整Base URL编码,也不会覆盖注解中的路径。
定义客户端接口
public interface MyClient { @GetExchange("/some-path") String getData(@UriVariable URI baseUrl); }
调用示例
myClient.getData(URI.create("http://some-url.com"));
此时实际请求地址会自动拼接为http://some-url.com/some-path,符合预期。
方法二:自定义请求拦截器(兼容Spring 6.1以下版本)
如果你的项目使用Spring 6.1之前的版本,可以通过ClientHttpRequestInterceptor动态修改请求URI,实现Base URL和路径的拼接。
1. 编写拦截器
@Component public class DynamicBaseUrlInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { // 从请求属性中获取动态传入的Base URL URI baseUrl = (URI) request.getAttribute("baseUrl"); if (baseUrl != null) { // 拼接Base URL和接口路径、查询参数 URI newUri = UriComponentsBuilder.fromUri(baseUrl) .path(request.getURI().getPath()) .query(request.getURI().getQuery()) .build().toUri(); // 包装请求,替换新的URI request = new HttpRequestWrapper(request) { @Override public URI getURI() { return newUri; } }; } return execution.execute(request, body); } }
2. 修改客户端接口
通过@RequestAttribute传递动态Base URL:
public interface MyClient { @GetExchange("/some-path") String getData(@RequestAttribute("baseUrl") URI baseUrl); }
3. 配置拦截器与客户端
在配置类中注册拦截器和HttpExchange客户端:
@Configuration public class HttpExchangeConfig { @Bean public RestClient.Builder restClientBuilder(DynamicBaseUrlInterceptor interceptor) { return RestClient.builder().interceptors(interceptor); } @Bean public MyClient myClient(RestClient.Builder builder) { return HttpServiceProxyFactory.forRestClient(builder).createClient(MyClient.class); } }
调用示例
myClient.getData(URI.create("http://some-url.com"));
此时请求地址会被拦截器拼接为http://some-url.com/some-path。
内容的提问来源于stack exchange,提问作者random
相关产品推荐
相关产品推荐

