post-image

RestTemplate trong Spring Boot là gì ?

Tổng quan

RestTemplate là một lớp trung tâm trong Spring Framework cho các cuộc gọi đồng bộ (synchronous calls) bởi Client để truy cập vào RESTful Web Service. Lớp này cung cấp các chức năng để tiêu thụ REST Services một cách dễ dàng. Khi sử dụng lớp nói trên, người dùng chỉ phải cung cấp URL, các tham số (nếu có) và trích xuất các kết quả nhận được.

Lấy tài nguyên từ request có phương thức GET

Nhận về dữ liệu dưới dạng JSON

Hãy bắt đầu với ví dụ sau chúng ta sẽ sử dụng getForEntity() để lấy tài nguyên từ request có phương thức GET

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));
Code language: JavaScript (javascript)

Lưu ý rằng chúng ta có quyền truy cập vào HTTP resoponse nên vì vậy chúng ta có thể thực hiện những việc như kiểm tra trạng thái để đảm bảo các hoạt động được diễn ra thành công với giá trị thực tế của response:

ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree(response.getBody()); JsonNode name = root.path("name"); assertThat(name.asText(), notNullValue());
Code language: JavaScript (javascript)

Chúng ta đang làm việc với phần body response như là một chuỗi và sử dụng Jackson(cấu trúc node của JSON do Jackson cung cấp) để xác thực một vài chi tiết.

Dữ liệu nhận về là POJO thay vì JSON

Chúng ta có thể tạo kết nối để response có thể trả về trực tiếp tới DTO class

public class Foo implements Serializable { private long id; private String name; // standard getters and setters }
Code language: PHP (php)

Và giờ chúng ta có thể sử dụng getForObjectAPI của RestTemplate để lấy dữ liệu

Foo foo = restTemplate .getForObject(fooResourceUrl + "/1", Foo.class); assertThat(foo.getName(), notNullValue()); assertThat(foo.getId(), is(1L));
Code language: JavaScript (javascript)

Sử dụng Head để lấy dữ liệu từ Header

Chúng ta hãy cùng xem cách sử dụng Head để lấy giá trị từ Header ở ví dụ dưới đây.

Chúng ta sẽ sử dụng API headForHeaders() ở đây:

HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl); assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON));

Sử dụng POST để tạo mới một tài nguyên

Để tạo mới một tài nguyên trong API, chúng ta có thể sử dụng phương thức postForLocation(), postForObject() hoặc là postForEntity().

Phương thức postForObject()

RestTemplate restTemplate = new RestTemplate(); HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar")); Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class); assertThat(foo, notNullValue()); assertThat(foo.getName(), is("bar"));
Code language: JavaScript (javascript)

Phương thức postForLocaltion()

Tương tự như trên, thao tác nay thay vì trả về tài nguyên đầy đủ thì nó chỉ trả về vị trí của tài nguyên đó sau khi được tạo thành công

HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar")); URI location = restTemplate .postForLocation(fooResourceUrl, request); assertThat(location, notNullValue());
Code language: JavaScript (javascript)

Phương thức exchange()

RestTemplate restTemplate = new RestTemplate(); HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar")); ResponseEntity<Foo> response = restTemplate .exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); Foo foo = response.getBody(); assertThat(foo, notNullValue()); assertThat(foo.getName(), is("bar"));
Code language: JavaScript (javascript)

Submit một form dữ liệu

Tiếp theo chúng ta hãy cùng xem cách để submit một form sử dụng phương thức POST

  • Đầu tiên chúng ta cần phải cài Content-Type header là application/x-www-form-urlencoded.
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
Code language: JavaScript (javascript)
  • Tiếp theo, chúng ta xây dựng một request sử dụng đến HttpEntity
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
Code language: JavaScript (javascript)
  • Cuối cùng chúng ta kết nối đến REST service bằng cách gọi phương thức restTemplate.postForEntity()
ResponseEntity<String> response = restTemplate.postForEntity( fooResourceUrl+"/form", request , String.class); assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
Code language: JavaScript (javascript)

Sử dụng PUT để cập nhật các tài nguyên

Ví dụ PUT đơn giản với phương thức exchange()

Chúng ta sẽ cùng sử dụng PUT đơn giản với ví dụ sau đây

Foo updatedInstance = new Foo("newName"); updatedInstance.setId(createResponse.getBody().getId()); String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId(); HttpEntity<Foo> requestUpdate = new HttpEntity<>(updatedInstance, headers); template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class);
Code language: JavaScript (javascript)

Phương thức PUT với exchange() và Request Callback

Hãy đảm bảo rằng chúng ta chuẩn bị callback, nơi mà có thể đặt tất cả các header của chúng ta cần cũng như nội dung request:

RequestCallback requestCallback(final Foo updatedInstance) { return clientHttpRequest -> { ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(clientHttpRequest.getBody(), updatedInstance); clientHttpRequest.getHeaders().add( HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); clientHttpRequest.getHeaders().add( HttpHeaders.AUTHORIZATION, "Basic " + getBase64EncodedLogPass()); }; }
Code language: PHP (php)

Tiếp theo chúng ta tạo một tài nguyên mới với phương thức POST

ResponseEntity<Foo> response = restTemplate .exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
Code language: HTML, XML (xml)

Và sau đó chúng ta cập nhật lại tài nguyên như sau:

Foo updatedInstance = new Foo("newName"); updatedInstance.setId(response.getBody().getId()); String resourceUrl =fooResourceUrl + '/' + response.getBody().getId(); restTemplate.execute( resourceUrl, HttpMethod.PUT, requestCallback(updatedInstance), clientHttpResponse -> null);
Code language: JavaScript (javascript)

Sử dụng phương thức DELETE để xóa một tài nguyên

Để xóa một tài nguyên có sẵn chúng ta sử dụng như sau:

String entityUrl = fooResourceUrl + "/" + existingResource.getId(); restTemplate.delete(entityUrl);
Code language: JavaScript (javascript)

Kết luận

Vậy là mình đã giới thiệu qua một số phương thức của RestTemplate trong Spring. Hi vọng mọi người thấy có ích ^^.

Leave a Reply

Your email address will not be published.