RestTemplate
是 Spring 框架提供的一种用于执行HTTP请求的同步客户端。它简化了与HTTP服务器的交互,并支持RESTful Web服务。
1. 添加依赖
首先,确保你的项目中包含了Spring Web的支持。如果你使用的是Maven,在pom.xml
文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 创建 RestTemplate
实例
你可以直接通过构造函数创建一个 RestTemplate
对象,或者更推荐地,利用RestTemplateBuilder
来构建,这样可以更容易地配置如超时时间等属性。
直接创建:
RestTemplate restTemplate = new RestTemplate();
在 Spring 应用中自动装配 RestTemplate
@Autowired
private RestTemplate restTemplate;
使用 RestTemplateBuilder 创建:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder
.setConnectTimeout(Duration.ofMillis(3000))
.setReadTimeout(Duration.ofMillis(3000))
.build();
}
3. 发送 GET 请求
- 获取简单类型数据:
String result = restTemplate.getForObject("http://example.com/api/data", String.class);
System.out.println(result);
- 获取复杂对象:
DataObject data = restTemplate.getForObject("http://example.com/api/data", DataObject.class);
- 使用参数:
Map<String, String> params = Collections.singletonMap("id", "42");
DataObject data = restTemplate.getForObject("http://example.com/api/data/{id}", DataObject.class, params);
4. 发送POST请求
- 发送简单的表单数据:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("key1", "value1");
map.add("key2", "value2");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity("http://example.com/api/submit", request, String.class);
- 发送JSON数据:
MyRequestObject obj = new MyRequestObject();
obj.setField1("value1");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<MyRequestObject> entity = new HttpEntity<>(obj, headers);
ResponseEntity<String> response = restTemplate.postForEntity("http://example.com/api/submit", entity, String.class);
5.发送 DELETE 请求
DELETE 请求通常用于删除资源。你可以使用 delete
方法来发送一个简单的 DELETE 请求,或者使用 exchange
方法来更灵活地控制请求头等信息。
- 简单 DELETE 请求:
restTemplate.delete("http://example.com/api/resource/42");
- 带参数的 DELETE 请求:
如果需要传递额外的参数,可以使用 UriComponentsBuilder
来构建 URL。
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com/api/resource/{id}")
.queryParam("param1", "value1");
restTemplate.delete(builder.buildAndExpand(42).toUri());
- 自定义请求头的 DELETE 请求:
需要设置自定义请求头,可以使用 HttpEntity<Void>
结合 exchange
方法。
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer your_token_here");
HttpEntity<Void> entity = new HttpEntity<>(headers);
restTemplate.exchange("http://example.com/api/resource/42",
HttpMethod.DELETE,
entity,
Void.class);
6.发送 PUT 请求
- 发送简单的 PUT 请求:
MyRequestObject obj = new MyRequestObject();
obj.setField1("new_value1");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<MyRequestObject> request = new HttpEntity<>(obj, headers);
restTemplate.put("http://example.com/api/resource/42", request);
- 处理响应:
得到服务器返回的数据,可以使用 exchange
方法,并指定响应类型。
ResponseEntity<String> response = restTemplate.exchange(
"http://example.com/api/resource/42",
HttpMethod.PUT,
request,
String.class
);
System.out.println(response.getBody());
- 带路径变量的 PUT 请求:
Map<String, String> params = Collections.singletonMap("id", "42");
restTemplate.put("http://example.com/api/resource/{id}", request, params);
7. 处理错误
RestTemplate
会抛出一些异常,如 ResourceAccessException
、HttpClientErrorException
和 HttpServerErrorException
。你可以捕获这些异常来处理不同的 HTTP 错误:
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// 自定义异常处理逻辑
}
});
8. 使用 ResponseEntity
RestTemplate
还提供了 ResponseEntity
类型,它允许你访问完整的 HTTP 响应,包括状态码和响应头:
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
if (response.getStatusCode().is2xxSuccessful()) {
String body = response.getBody();
// 处理响应体
}
注意事项
RestTemplate
是一个同步的客户端,如果你需要异步操作,可以考虑使用WebClient
。- 从 Spring Framework 5 开始,
RestTemplate
被标记为过时,推荐使用WebClient
,它提供了更现代的异步、非阻塞的 API。 - 确保在使用
RestTemplate
时处理好异常和错误情况。