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; }
|
1
| User user = restTemplate.getForObject(userResourceUrl + "/1", User.class);
|
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);
|