7.3.4 GỬI dữ liệu tài nguyên (POSTing resource data)
Bây giờ, giả sử rằng bạn muốn thêm một nguyên liệu mới vào thực đơn của Taco Cloud. Một yêu cầu HTTP POST tới endpoint …/ingredients với dữ liệu nguyên liệu trong phần thân yêu cầu sẽ thực hiện điều đó. RestTemplate có ba cách để gửi một yêu cầu POST, mỗi cách đều có các biến thể quá tải giống nhau để chỉ định URL. Nếu bạn muốn nhận lại tài nguyên Ingredient mới được tạo sau yêu cầu POST, bạn có thể dùng postForObject() như sau:
public Ingredient createIngredient(Ingredient ingredient) {
return rest.postForObject("http://localhost:8080/ingredients",
ingredient, Ingredient.class);
}Biến thể này của phương thức postForObject() nhận một URL dưới dạng String, đối tượng cần gửi tới máy chủ, và kiểu miền (domain type) mà phần thân phản hồi sẽ được ánh xạ tới. Mặc dù trong trường hợp này bạn không sử dụng, nhưng tham số thứ tư có thể là một Map chứa giá trị biến URL hoặc một danh sách tham số để thay thế vào URL.
Nếu client của bạn cần biết vị trí (location) của tài nguyên mới được tạo, bạn có thể gọi postForLocation() thay thế, như sau:
public java.net.URI createIngredient(Ingredient ingredient) {
return rest.postForLocation("http://localhost:8080/ingredients",
ingredient);
}Lưu ý rằng postForLocation() hoạt động tương tự như postForObject(), ngoại trừ việc nó trả về một URI của tài nguyên mới được tạo thay vì trả về chính đối tượng tài nguyên. URI được trả về được lấy từ header Location trong phản hồi. Trong trường hợp hiếm hoi bạn cần cả vị trí và payload phản hồi, bạn có thể gọi postForEntity() như sau:
public Ingredient createIngredient(Ingredient ingredient) {
ResponseEntity<Ingredient> responseEntity =
rest.postForEntity("http://localhost:8080/ingredients",
ingredient,
Ingredient.class);
log.info("New resource created at " +
responseEntity.getHeaders().getLocation());
return responseEntity.getBody();
}Mặc dù các phương thức của RestTemplate có mục đích sử dụng khác nhau, nhưng cách sử dụng của chúng khá giống nhau. Điều này giúp bạn dễ dàng thành thạo với RestTemplate và sử dụng nó trong mã client của mình.
