如何配置RestTemplate适配不同URL与ResponseEntity并避免重复设置Header和URI
统一Header配置方案
可以通过Spring RestTemplate自带的ClientHttpRequestInterceptor拦截器实现公共Header全局自动注入,无需在每次业务调用时手动设置,改动成本极低,不需要修改现有业务调用逻辑:
- 首先自定义公共Header拦截器:
import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; import java.util.Collections; public class CommonHeaderInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { HttpHeaders headers = request.getHeaders(); // 固定公共Header直接写在这里即可 headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); // 如果token是动态的(比如从当前请求上下文获取登录用户token),可以按以下方式获取: // ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // if (attr != null) { // String token = attr.getRequest().getHeader("Authorization").replace("Bearer ", ""); // headers.setBearerAuth(token); // } // 如果token是固定值直接设置即可 headers.setBearerAuth("你的固定token"); return execution.execute(request, body); } }
- 修改原有RestTemplate配置,注册拦截器:
@Configuration public class RestTemplateConfiguration { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); // 注册公共Header拦截器 restTemplate.setInterceptors(Collections.singletonList(new CommonHeaderInterceptor())); return restTemplate; } }
URI复用优化方案
常用的优化方式有两种,可根据业务场景选择:
- 统一管理URI常量:把所有接口的URI模板定义为常量类,避免重复编写字符串,也方便后续统一修改:
public class ApiUriConstants { // 带占位符的URI模板 public static final String CAR_DETAIL_URI = "/api/cars/{carId}/detail"; public static final String CARS_LIST_URI = "/api/cars/list"; }
调用时直接使用常量即可,RestTemplate的exchange方法原生支持URI模板+可变参数填充占位符,不需要手动调用buildAndExpand:
// 直接传URI常量和占位符参数即可,框架自动填充 ResponseEntity<CarDetail> savingAmountConsumed = restTemplate.exchange( ApiUriConstants.CAR_DETAIL_URI, HttpMethod.PUT, requestEntity, CarDetail.class, uriVariable );
- 配置统一根路径:如果所有接口都调用同一个服务的域名,可以给RestTemplate配置全局根路径,调用时只需要传相对路径即可:
@Configuration public class RestTemplateConfiguration { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.setInterceptors(Collections.singletonList(new CommonHeaderInterceptor())); // 配置统一的API根域名 restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory("https://你的公共API根域名.com")); return restTemplate; } }
后续调用不需要每次填写完整URL,直接传相对路径即可:
ResponseEntity<Cars> cars= restTemplate.exchange( ApiUriConstants.CARS_LIST_URI, HttpMethod.GET, null, Cars.class );
如果需要调用多个不同域名的服务,可以定义多个RestTemplate Bean,用@Qualifier注解区分注入即可。
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

