RestTemplate 是 Spring Framework 提供的一个同步 HTTP 客户端,用于与外部服务进行交互。它封装了常见的 HTTP 请求操作,简化了客户端发送 HTTP 请求、接收响应的过程。通过 RestTemplate,你可以轻松地调用 RESTful APIs,处理请求和响应的不同类型(如 JSON、XML、文本等)。
RestTemplate 中包含了许多方法,下面简单列举几个常用的:
实际上我们不需要为了学习 RestTemplate 去记住所有的方法,简单挑选几个常用的掌握,等到实际用到时,结合相应文档自然会得心应手。
public void test_get() {
ResponseEntity forEntity = restTemplate.getForEntity("http://localhost:8080/get", String.class);
System.out.println(forEntity.getBody());
String forObject = restTemplate.getForObject("http://localhost:8080/get", String.class);
System.out.println(forObject);
}
public void test_get_person() {
ResponseEntity forEntity = restTemplate.getForEntity("http://localhost:8080/person/get", Person.class);
System.out.println(forEntity.getBody().getName());
Person forObject = restTemplate.getForObject("http://localhost:8080/person/get", Person.class);
System.out.println(forObject.getName());
}
public void test_head() {
HttpHeaders httpHeaders = restTemplate.headForHeaders("http://localhost:8080/get");
System.out.println(httpHeaders);
}
public void test_post() {
RequestEntity
RequestEntity 是 HttpEntity 的一个子类,专门用于表示 HTTP 请求。它不仅封装了请求的 头部 和 正文,还包括 HTTP 方法(如 GET, POST, PUT, DELETE)和 URL,可以更全面地描述一个 HTTP 请求。
RequestEntity requestEntity = new RequestEntity<>(
body,
headers,
httpMethod,
url
);
ResponseEntity 是 HttpEntity 的另一个子类,专门用于表示 HTTP 响应。它除了包含 HTTP 响应的 头部 和 正文 外,还封装了 HTTP 状态码。
ResponseEntity responseEntity = new ResponseEntity<>(
body,
headers,
statusCode
);
默认情况下,RestTemplate 会使用 SimpleClientHttpRequestFactory,它使用 HttpURLConnection 来执行 HTTP 请求。这个实现是同步的,并且比较简单,只适合一些轻量级的应用。
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
// 连接超时是指客户端在尝试建立连接时,等待服务器响应的最大时间
factory.setConnectTimeout(1000);
// 发送请求后,等待响应数据的最大时间
factory.setReadTimeout(1000);
return new RestTemplate(factory);
}
最常见的用法在 header 中设置 jwt token。
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// 自定义请求拦截器
restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException {
request.getHeaders().set("Authorization", "Bearer your_token by Interceptor");
return execution.execute(request, body);
}
});
return restTemplate;
}
https://www.baeldung.com/rest-template#bd-overview