Spring 5.0中为RestTemplate设置基础URL/URI的方法
在Spring Boot 2中给RestTemplate配置可配置的基础URL
嗨,我之前也碰到过这个问题——旧版本RestTemplate的baseUrl构造方法确实被弃用了,不过用DefaultUriTemplateHandler完全能搞定,还能结合配置属性灵活切换环境,给你一步步拆解下:
步骤1:在配置文件中定义基础URL
先把基础URL放到配置文件里(比如application.yml),这样开发、测试、生产环境能轻松切换:
# application.yml app: api: base-url: https://api.your-domain.com/v1
步骤2:创建RestTemplate Bean并配置UriTemplateHandler
接下来自定义RestTemplate的Bean,把DefaultUriTemplateHandler配置进去,同时绑定配置文件里的baseUrl:
首先写一个简单的属性绑定类,用来读取配置:
import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "app.api") public class ApiProperties { private String baseUrl; // Getter和Setter public String getBaseUrl() { return baseUrl; } public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; } }
然后在配置类里创建RestTemplate:
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.DefaultUriTemplateHandler; @Configuration @EnableConfigurationProperties(ApiProperties.class) public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ApiProperties apiProperties) { RestTemplate restTemplate = new RestTemplate(); // 初始化DefaultUriTemplateHandler并设置基础URL DefaultUriTemplateHandler uriHandler = new DefaultUriTemplateHandler(); uriHandler.setBaseUrl(apiProperties.getBaseUrl()); // 可选:设置编码模式,避免中文或特殊字符编码问题 uriHandler.setEncodingMode(DefaultUriTemplateHandler.EncodingMode.URI_COMPONENT); // 把配置好的UriHandler绑定给RestTemplate restTemplate.setUriTemplateHandler(uriHandler); return restTemplate; } }
步骤3:使用RestTemplate发送请求
现在发送请求时只需要写相对路径,RestTemplate会自动拼接基础URL:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class ApiService { @Autowired private RestTemplate restTemplate; public User getUserById(Long userId) { // 实际请求的URL是:https://api.your-domain.com/v1/users/{userId} return restTemplate.getForObject("/users/{id}", User.class, userId); } }
小提醒
- 不用纠结基础URL结尾要不要加斜杠:
DefaultUriTemplateHandler会自动处理拼接逻辑,不管baseUrl是https://api.your-domain.com/v1还是https://api.your-domain.com/v1/,和相对路径/users拼接后都会得到正确的https://api.your-domain.com/v1/users - 如果需要更复杂的URL处理逻辑,还可以自定义
UriTemplateHandler子类,不过大部分场景下DefaultUriTemplateHandler足够用了
内容的提问来源于stack exchange,提问作者mnd
相关产品推荐
相关产品推荐

