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

如何配置RestTemplate适配不同URL与ResponseEntity并避免重复设置Header和URI

统一Header配置方案

可以通过Spring RestTemplate自带的ClientHttpRequestInterceptor拦截器实现公共Header全局自动注入,无需在每次业务调用时手动设置,改动成本极低,不需要修改现有业务调用逻辑:

  1. 首先自定义公共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);
    }
}
  1. 修改原有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:27:04