You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:42:55