RestTemplate 使用指南

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

GET

获取JSON字符串

使用getForEntity()方法

1
2
3
4
RestTemplate restTemplate = new RestTemplate();
String fooResourceUrl = "http://localhost:8080/spring-rest/foos";
ResponseEntity<String> response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

通过getForEntity()我们可以获取到完整的HTTP response,因此可以通过检测状态码来判断请求是否真正执行成功。也可以通过getBody()方法获取返回的具体内容,如:

1
2
3
4
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(response.getBody());
JsonNode name = root.path("name");
assertThat(name.asText(), notNullValue());

获取POJO对象

直接将请求映射为一个POJO对象。

1
2
3
4
5
6
public class User implements Serializable {
private long id;

private String name;
// 这里省略了getters和setters
}
1
User user = restTemplate.getForObject(userResourceUrl + "/1", User.class);

获取Headers

1
HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl);

POST

RestTemplate提供了三个API用来创建资源,它们分别是postForLocation()postForObject()postForEntity()postForLocation()返回新创建资源的URI,postForObject()则返回新创建的资源本身。

postForObject方法

1
2
3
4
ClientHttpRequestFactory requestFactory = getClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(requestFactory);
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);

postForLocation 方法

1
2
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
URI location = restTemplate.postForLocation(fooResourceUrl, request);

exchange方法

1
2
3
4
RestTemplate restTemplate = new RestTemplate();
HttpEntity<User> request = new HttpEntity<>(new User("CD826"));
ResponseEntity<User> response = restTemplate.exchange(userResourceUrl, HttpMethod.POST, request, User.class);
User user = response.getBody();

PUT

1
2
3
4
5
User updatedInstance = new User("newName");
updatedInstance.setId(createResponse.getBody().getId());
String resourceUrl = userResourceUrl + '/' + createResponse.getBody().getId();
HttpEntity<User> requestUpdate = new HttpEntity<>(updatedInstance, headers);
template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class);

DELETE

1
2
String entityUrl = fooResourceUrl + "/" + existingResource.getId();
restTemplate.delete(entityUrl);