1、概述
RestTemplate提供了多种便捷访问远程HTTP服务的方法,是一种简单便捷访问Restful服务的模块类,是Spring提供的用于访问Rest服务的客户端模块工具集。
在Spring应用中访问REST服务涉及到Spring RestTemplate类的使用。RestTemplate类与Spring中其他 *Template类(如JdbcTemplate,JmsTemplate)类似,提供一种用于执行复杂任务的具有默认行为的简化方法。
RestTemplate类是用于在客户端中同步调用REST服务。所以,它的主要方法与REST紧密相关,主要是HTTP协议的GET,POST,PUT,DELETE和OPTIONS方法。
注:从Spring Framework 5开始,随着WebFlux堆栈,spring引入了新的HTTP客户端WebClient。WebClient提供了一个有效的创建RestTemplate、支持同步和异步,以及流场景。也就是说,如果我们正在开发新应用程序或迁移旧应用程序,则使用WebClient是个好主意。展望未来,在未来的版本中将不再使用RestTemplate。
2、创建RestTemplate bean
下面是一些应用程序中创建RestTemplate bean的例子,在这里只创建很简单的bean。
2.1使用RestTemplateBuilder
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.setConnectTimeout(Duration.ofMillis(3000))
.setReadTimeout(Duration.ofMillis(3000))
.build();
}
2.2使用SimpleClientHttpRequestFactory
@Bean
public RestTemplate restTemplate() {
var factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(3000);
factory.setReadTimeout(3000);
return new RestTemplate(factory);
}
2.3使用Apache HTTPClient
@Autowired
CloseableHttpClient httpClient;
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
return restTemplate;
}
@Bean
public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory
= new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setHttpClient(httpClient);
return clientHttpRequestFactory;
}
2.4、注入RestTemplate bean
使用@Autowired注解注入RestTemplate bean,如果有多个具有不同配置的RestTemplate类型bean,使用@Qualifier注解注入。
@Autowired
private RestTemplate restTemplate;
3、RestTemplate – HTTP GET 示例
常用方法有:
- getForObject(url, classType) – 通过GET方式请求URL获得响应。将HTTP response转换成一个指定的object对象
- getForEntity(url, responseType) – 通过GET方式请求URL获得ResponseEntity类型返回值。
- exchange(requestEntity, responseType)
- exchange(String url, HttpMethod method, HttpEntity<?> requestEntity,
Class responseType, Map<String,?> uriVariables)
参数说明:
url:请求路径
method:请求的方法(GET、POST、PUT等)
requestEntity:HttpEntity对象,封装了请求头和请求体
responseType:返回数据类型
uriVariables:支持PathVariable类型的数据。
3.1 HTTP GET REST APIs
@GetMapping(value = "/employees",produces = {MediaType.APPLICATION_XML_VALUE,
MediaType.APPLICATION_JSON_VALUE})
public EmployeeListVO getAllEmployees(
@RequestHeader(name = "X-COM-PERSIST", required = true) String headerPersist,
@RequestHeader(name = "X-COM-LOCATION", defaultValue = "ASIA") String headerLocation) {
LOGGER.info("Header X-COM-PERSIST :: " + headerPersist);
LOGGER.info("Header X-COM-LOCATION :: " + headerLocation);
EmployeeListVO employees = getEmployeeList();
return employees;
}
@GetMapping(value = "/employees/{id}",produces = {MediaType.APPLICATION_XML_VALUE,
MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<EmployeeVO> getEmployeeById (@PathVariable("id") Integer id) {
LOGGER.info("Requested employee id :: " + id);
if (id != null && id > 0) {
//TODO: Fetch the employee and return from here
EmployeeVO employee = new EmployeeVO(id, "Lokesh","Gupta", "howtodoinjava@gmail.com");
return new ResponseEntity<EmployeeVO>(employee, HttpStatus.OK);
}
return new ResponseEntity<EmployeeVO>(HttpStatus.NOT_FOUND);
}
3.2 RestTemplate示例 - - 使用REST API
在给定的示例中,以字符串形式获取API响应。需要使用ObjectMapper将结果解析为POJO。
当从服务器获得无法解析的响应并且无法控制将其固定在服务器端时,此方法很有用。在这里,我们可以将响应作为字符串获取,并在使用响应之前使用自定义解析器或字符串替换函数。
private static void getEmployees()
{
final String uri = "http://localhost:8080/springrestexample/employees";
//TODO: Autowire the RestTemplate in all the examples
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(uri, String.class);
System.out.println(result);
}
3.3 RestTemplate示例(API响应转化为POJO)
在示例中,我们将API响应直接转化为POJO对象。
使用getForObject() 方法:
private static void getEmployees()
{
final String uri = "http://localhost:8080/springrestexample/employees";
RestTemplate restTemplate = new RestTemplate();
EmployeeListVO result = restTemplate.getForObject(uri, EmployeeListVO.class);
//Use the response
}
使用getForEntity()方法:
private static void getEmployees()
{
final String uri = "http://localhost:8080/springrestexample/employees";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<EmployeeListVO> response = restTemplate.getForEntity(uri, EmployeeListVO.class);
//Use the response.getBody()
}
3.4 RestTemplate发送HTTP Headers
private static void getEmployees()
{
final String uri = "http://localhost:8080/springrestexample/employees";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.set("X-COM-PERSIST", "NO");
headers.set("X-COM-LOCATION", "USA");
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
//Use the response.getBody()
}
3.5 RestTemplate发送URL参数
private static void getEmployeeById()
{
final String uri = "http://localhost:8080/springrestexample/employees/{id}";
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<String, String>();
params.put("id", "1");
EmployeeVO result = restTemplate.getForObject(uri, EmployeeVO.class, params);
//Use the result
}
4、RestTemplate – HTTP POST 示例
常用方法有:
- postForObject(url, request, classType) – POST方式发送对象,并将响应结果转化为指定classType类型。
- postForEntity(url, request, responseType) – POST方式发送对象,并将响应结果转化为指定ResponseEntity类型。
- postForLocation(url, request, responseType)
- exchange(url, requestEntity, responseType)
- execute(url, httpMethod, requestCallback, responseExtractor)
4.1 HTTP POST REST API
@PostMapping(value = "/employees")
public ResponseEntity<String> createEmployee(EmployeeVO employee)
{
//TODO: Save employee details which will generate the employee id
employee.setId(111);
//Build URI
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(employee.getId())
.toUri();
return ResponseEntity.created(location).build();
}
4.2 RestTemplate示例 - - 使用POST API
Spring REST客户端使用RestTemplate访问HTTP POST api请求。
private static void createEmployee()
{
final String uri = "http://localhost:8080/springrestexample/employees";
RestTemplate restTemplate = new RestTemplate();
EmployeeVO newEmployee = new EmployeeVO(-1, "Adam", "Gilly", "test@email.com");
EmployeeVO result = restTemplate.postForObject( uri, newEmployee, EmployeeVO.class);
System.out.println(result);
}
5、RestTemplate – HTTP PUT 示例
常用方法有:
- put(url, request) – PUT 方式发送request对象。
5.1 HTTP PUT REST API
@PutMapping(value = "/employees/{id}")
public ResponseEntity<EmployeeVO> updateEmployee(@PathVariable("id") int id
,EmployeeVO employee)
{
//TODO: Save employee details
return new ResponseEntity<EmployeeVO>(employee, HttpStatus.OK);
}
5.2 RestTemplate示例 - - 使用PUT API
private static void updateEmployee()
{
final String uri = "http://localhost:8080/springrestexample/employees/{id}";
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<String, String>();
params.put("id", "2");
EmployeeVO updatedEmployee = new EmployeeVO(2, "New Name", "Gilly", "test@email.com");
restTemplate.put ( uri, updatedEmployee, params );
}
6、RestTemplate – HTTP DELETE 示例
常用方法有:
- delete(url) – 请求指定URL删除资源。
6.1 HTTP DELETE REST API
@DeleteMapping(value = "/employees/{id}")
public ResponseEntity<String> deleteEmployee(@PathVariable("id") int id)
{
//TODO: Delete the employee record
return new ResponseEntity<String>(HttpStatus.OK);
}
6.2 RestTemplate示例 - - 使用DELETE API
private static void deleteEmployee()
{
final String uri = "http://localhost:8080/springrestexample/employees/{id}";
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<String, String>();
params.put("id", "2");
restTemplate.delete ( uri, params );
}
可复制和修改以上Spring RestTemplate示例,以在Spring WebMVC应用程序中构建Spring REST API消费者。