目录
概述
使用GET方式获取资源
通过普通的JSON格式
通过POJO方式
使用Head去获取header
使用POST方式去创建资源
postForObject()
exchange()
提交表单
使用OPTION获取可操作的类型
使用PUT来更新资源
使用DELETE来删除资源
设置超时时间
本篇文章将介绍如何使用RestTemplate,需要注意的是新版的spring framework,由于有WebFlux的加持,Spring提供了一个新版的Rest Client,叫做WebClient,用来替代RestTemplate,WebClient可以提供传统RestTemplate的同步调用,也可以提供异步非阻塞的方式调用。如果你在构建一个新的服务或者在进行系统升级,考虑使用WebClient,因为在之后的版本中spring将会逐步弃用RestTemplate。
一个最简单的例子就是通过getForEntity(),可以获取到返回的所有内容
RestTemplate restTemplate = new RestTemplate();
String fooResourceUrl
= "http://localhost:8080/spring-rest/foos";
ResponseEntity response
= restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);
如果我们需要响应中的某些字段,则需要使用Jackson包去解析字符串
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(response.getBody());
JsonNode name = root.path("name");
Assertions.assertNotNull(name.asText());
如果我们只关心返回消息体内容,我们使用POJO方式,则需要有一个DTO,用来转化资源格式。
public class Foo implements Serializable {
private long id;
private String name;
// getters and setters
}
Foo foo = restTemplate
.getForObject(fooResourceUrl + "/1", Foo.class);
Assertions.assertNotNull(foo.getName());
Assertions.assertEquals(foo.getId(), 1L);
HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl);
Assertions.assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON));
RestTemplate restTemplate = new RestTemplate();
HttpEntity request = new HttpEntity<>(new Foo("bar"));
Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);
Assertions.assertNotNull(foo);
Assertions.assertEquals(foo.getName(), "bar");
RestTemplate restTemplate = new RestTemplate();
HttpEntity request = new HttpEntity<>(new Foo("bar"));
ResponseEntity response = restTemplate
.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED);
Foo foo = response.getBody();
Assertions.assertNotNull(foo);
Assertions.assertEquals(foo.getName(), "bar");
如果是表单格式的数据我们首先要将ContentType设置成application/x-www-form-urlencoded,
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
将数据封装到Map中 ,并构建HttpEntity,
MultiValueMap map= new LinkedMultiValueMap<>();
map.add("id", "1");
HttpEntity> request = new HttpEntity<>(map, headers);
最后,我们通过调用postForEntity完成调用。
ResponseEntity response = restTemplate.postForEntity(
fooResourceUrl+"/form", request , String.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED);
可以使用optionsForAllow来获取资源的可操作类型。
Set optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl);
HttpMethod[] supportedMethods
= {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE};
Assertions.assertTrue(optionsForAllow.containsAll(Arrays.asList(supportedMethods)));
上面在POST来创建资源时,我们使用了exchange(),此时同样也可以使用
Foo updatedInstance = new Foo("newName");
updatedInstance.setId(createResponse.getBody().getId());
String resourceUrl =
fooResourceUrl + '/' + createResponse.getBody().getId();
HttpEntity requestUpdate = new HttpEntity<>(updatedInstance, headers);
template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class);
我们可以直接使用delete方法来删除资源
String entityUrl = fooResourceUrl + "/" + existingResource.getId();
restTemplate.delete(entityUrl);
RestTemplate默认的connectionTimeout和readTimeout都是0,也就是无限等待。根据项目的需要可以设置相应的超时时间。可以通过使用ClientHttpRequestFactory来设置。
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
private ClientHttpRequestFactory getClientHttpRequestFactory() {
int timeout = 5000;
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory
= new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(timeout);
return clientHttpRequestFactory;
}