添加依赖项
如果你使用Maven,需要在pom.xml文件中包含Spring Web依赖项来使用RestTemplate:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
如果使用的是Gradle,在build.gradle文件中添加以下依赖项:
arduino
implementation 'org.springframework.boot:spring-boot-starter-web'
创建RestTemplate Bean
在Spring配置类中定义一个RestTemplate bean,以便在需要的地方注入它:
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
使用RestTemplate进行HTTP请求
GET请求
要执行GET请求,可以使用getForObject
或getForEntity
方法。
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class RestTemplateService {
@Autowired
private RestTemplate restTemplate;
public String getPost(int id) {
String url = "https://jsonplaceholder.typicode.com/posts/" + id;
return restTemplate.getForObject(url, String.class);
}
}
POST请求
对于POST请求,可以使用postForObject
或postForEntity
方法。
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@Service
public class RestTemplateService {
@Autowired
private RestTemplate restTemplate;
public String createPost() {
String url = "https://jsonplaceholder.typicode.com/posts";
Map<String, String> request = new HashMap<>();
request.put("title", "foo");
request.put("body", "bar");
request.put("userId", "1");
return restTemplate.postForObject(url, request, String.class);
}
}
PUT请求
要更新资源,可以使用put
方法:
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@Service
public class RestTemplateService {
@Autowired
private RestTemplate restTemplate;
public void updatePost(int id) {
String url = "https://jsonplaceholder.typicode.com/posts/" + id;
Map<String, String> request = new HashMap<>();
request.put("title", "updated title");
request.put("body", "updated body");
restTemplate.put(url, request);
}
}
DELETE请求
要删除资源,使用delete
方法:
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class RestTemplateService {
@Autowired
private RestTemplate restTemplate;
public void deletePost(int id) {
String url = "https://jsonplaceholder.typicode.com/posts/" + id;
restTemplate.delete(url);
}
}
处理响应
RestTemplate提供了几种处理响应的方法。最简单的是getForObject
,它直接返回响应体。或者,getForEntity
返回一个ResponseEntity
,其中包含更多详细信息,如响应头和状态码。
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class RestTemplateService {
@Autowired
private RestTemplate restTemplate;
public ResponseEntity<String> getPostEntity(int id) {
String url = "https://jsonplaceholder.typicode.com/posts/" + id;
return restTemplate.getForEntity(url, String.class);
}
}
自定义RestTemplate
超时配置
可以为RestTemplate使用的底层HTTP客户端配置超时:
java
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(5000);
factory.setConnectTimeout(5000);
return new RestTemplate(factory);
}
}
拦截器
可以添加拦截器来操作请求和响应:
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.Collections;
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(new CustomClientHttpRequestInterceptor()));
return restTemplate;
}
}
class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
// 在此处修改请求
ClientHttpResponse response = execution.execute(request, body);
// 在此处修改响应
return response;
}
}
注意事项
-
阻塞特性:RestTemplate是同步的,会阻塞执行线程,直到请求完成。对于高吞吐量或对延迟敏感的应用程序,这可能是一个缺点。
-
弃用:随着WebClient的引入,RestTemplate不再是新开发的首选。Spring团队建议在非阻塞和响应式应用程序中使用WebClient。
-
缺乏高级功能:RestTemplate缺乏WebClient提供的一些高级功能和灵活性,例如更好的非阻塞I/O处理和响应式流处理。
结论
RestTemplate是在Spring应用程序中与RESTful Web服务交互的强大且易于使用的工具。其简单的API允许快速集成和处理HTTP请求和响应。