Skip to content

7.3.1 Lấy tài nguyên bằng GET

Giả sử bạn muốn lấy một nguyên liệu (ingredient) từ API của Taco Cloud. Để làm điều đó, bạn có thể sử dụng getForObject() của RestTemplate để truy xuất nguyên liệu đó. Ví dụ, đoạn mã sau sử dụng RestTemplate để lấy một đối tượng Ingredient dựa vào ID của nó:

java
public Ingredient getIngredientById(String ingredientId) {
  return rest.getForObject("http://localhost:8080/ingredients/{id}",
                    Ingredient.class, ingredientId);
}

Ở đây, bạn đang sử dụng biến thể của getForObject() chấp nhận một URL dưới dạng String và sử dụng danh sách biến để chèn các biến vào URL. Tham số ingredientId được truyền vào phương thức getForObject() sẽ được dùng để thay thế cho placeholder {id} trong URL được cung cấp. Mặc dù ví dụ này chỉ có một biến URL, nhưng điều quan trọng là cần biết rằng các tham số biến sẽ được gán cho các placeholder theo đúng thứ tự mà chúng được truyền vào.

Tham số thứ hai của getForObject() là kiểu dữ liệu mà phản hồi sẽ được ánh xạ tới. Trong trường hợp này, dữ liệu phản hồi (có khả năng là ở định dạng JSON) sẽ được giải tuần tự (deserialized) thành một đối tượng Ingredient và được trả về.

Ngoài ra, bạn cũng có thể sử dụng một Map để chỉ định các biến URL, như được minh họa bên dưới:

java
public Ingredient getIngredientById(String ingredientId) {
  Map<String, String> urlVariables = new HashMap<>();
  urlVariables.put("id", ingredientId);
  return rest.getForObject("http://localhost:8080/ingredients/{id}",
                  Ingredient.class, urlVariables);
}

Trong trường hợp này, giá trị của ingredientId sẽ được ánh xạ tới khóa id. Khi yêu cầu được gửi đi, placeholder {id} sẽ được thay thế bởi giá trị tương ứng trong Map với khóa là id.

Sử dụng một tham số kiểu URI thì có phần phức tạp hơn một chút, đòi hỏi bạn phải tạo ra một đối tượng URI trước khi gọi getForObject(). Tuy nhiên, về cơ bản thì nó vẫn tương tự như các biến thể khác, như được thể hiện dưới đây:

java
public Ingredient getIngredientById(String ingredientId) {
  Map<String, String> urlVariables = new HashMap<>();
  urlVariables.put("id", ingredientId);
  URI url = UriComponentsBuilder
          .fromHttpUrl("http://localhost:8080/ingredients/{id}")
          .build(urlVariables);
  return rest.getForObject(url, Ingredient.class);
}

Tại đây, đối tượng URI được tạo ra từ một chuỗi URL, và các placeholder trong chuỗi đó được điền vào từ các cặp khóa-giá trị trong một Map, tương tự như biến thể getForObject() trước đó. Phương thức getForObject() là cách đơn giản và trực tiếp để lấy một tài nguyên. Nhưng nếu client cần thêm thông tin ngoài phần thân của phản hồi (payload body), bạn nên cân nhắc sử dụng getForEntity().

Phương thức getForEntity() hoạt động tương tự như getForObject(), nhưng thay vì trả về một đối tượng miền đại diện cho payload của phản hồi, nó sẽ trả về một đối tượng ResponseEntity bao bọc đối tượng miền đó. ResponseEntity cho phép truy cập thêm vào các chi tiết khác của phản hồi.

Ví dụ, giả sử rằng ngoài dữ liệu nguyên liệu, bạn còn muốn kiểm tra tiêu đề Date từ phản hồi. Với getForEntity(), việc này trở nên đơn giản, như được minh họa trong đoạn mã sau:

java
public Ingredient getIngredientById(String ingredientId) {
  ResponseEntity<Ingredient> responseEntity =
    rest.getForEntity("http://localhost:8080/ingredients/{id}",
              Ingredient.class, ingredientId);
  log.info("Fetched time: " +
              responseEntity.getHeaders().getDate());
  return responseEntity.getBody();
}

Phương thức getForEntity() được overload với các tham số giống như getForObject(), vì vậy bạn có thể truyền các biến URL như một danh sách biến, hoặc gọi getForEntity() với một đối tượng URI.

Released under the MIT License.