Java 中使用RestTemplate传递 HTTP Header 有多种方式,以下是常用的几种方法:
1. 使用HttpHeaders和HttpEntity(推荐)
java
复制
import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; public class RestTemplateExample { public void sendRequestWithHeaders() { RestTemplate restTemplate = new RestTemplate(); // 创建请求头 HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer your_token_here"); headers.set("Content-Type", "application/json"); headers.set("X-Custom-Header", "custom_value"); // 如果有多个相同名称的header,使用add headers.add("X-Request-ID", "uuid-123"); // 创建请求实体(body可以是null对于GET请求) HttpEntity<String> entity = new HttpEntity<>(headers); // 发送GET请求 ResponseEntity<String> response = restTemplate.exchange( "https://api.example.com/data", HttpMethod.GET, entity, String.class ); String result = response.getBody(); } }2. POST 请求带 Header 和 Body
java
复制
public void postWithHeaders() { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBearerAuth("your_jwt_token"); // 设置Bearer Token // 请求体 String jsonBody = "{\"name\":\"test\",\"value\":123}"; // 组合header和body HttpEntity<String> entity = new HttpEntity<>(jsonBody, headers); ResponseEntity<String> response = restTemplate.postForEntity( "https://api.example.com/create", entity, String.class ); }3. 使用ClientHttpRequestInterceptor(全局配置)
如果需要为所有请求添加相同的 Header(如统一的认证信息):
java
复制
import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.support.HttpRequestWrapper; public class RestTemplateConfig { public RestTemplate createRestTemplateWithInterceptor() { RestTemplate restTemplate = new RestTemplate(); // 添加拦截器 restTemplate.getInterceptors().add((request, body, execution) -> { request.getHeaders().set("Authorization", "Bearer " + getToken()); request.getHeaders().set("X-API-Key", "your_api_key"); return execution.execute(request, body); }); return restTemplate; } private String getToken() { // 获取token的逻辑 return "dynamic_token"; } }4. 使用RequestCallback(更底层控制)
java
复制
public void requestWithCallback() { RestTemplate restTemplate = new RestTemplate(); RequestCallback requestCallback = request -> { request.getHeaders().set("Authorization", "Bearer token123"); // 可以在这里写入body }; ResponseExtractor<String> responseExtractor = response -> new String(response.getBody().readAllBytes()); String result = restTemplate.execute( "https://api.example.com/data", HttpMethod.GET, requestCallback, responseExtractor ); }5. 使用UriComponentsBuilder+ Header
java
复制
public void getWithParamsAndHeaders() { RestTemplate restTemplate = new RestTemplate(); // 构建URL String url = UriComponentsBuilder .fromHttpUrl("https://api.example.com/search") .queryParam("page", 1) .queryParam("size", 10) .toUriString(); HttpHeaders headers = new HttpHeaders(); headers.set("Accept", "application/json"); HttpEntity<Void> entity = new HttpEntity<>(headers); ResponseEntity<String> response = restTemplate.exchange( url, HttpMethod.GET, entity, String.class ); }常用 Header 设置方法
表格
复制
| 方法 | 说明 |
|---|---|
headers.set(key, value) | 设置单个header(覆盖已有) |
headers.add(key, value) | 添加header(支持多值) |
headers.setContentType(MediaType) | 设置Content-Type |
headers.setBearerAuth(token) | 设置Bearer认证 |
headers.setBasicAuth(username, password) | 设置Basic认证 |
headers.setAll(Map) | 批量设置 |
注意事项
Spring Boot 3.x / Spring 6+:
RestTemplate已被标记为弃用,建议迁移到WebClient(响应式)或RestClient(Spring 6.1+)线程安全:
RestTemplate是线程安全的,建议配置为单例编码问题:中文内容建议设置
MediaType.APPLICATION_JSON_UTF8