7.1.2 Gửi dữ liệu lên máy chủ
Cho đến thời điểm này, API của bạn có thể trả về tối đa một tá taco được tạo gần đây nhất. Nhưng những chiếc taco đó được tạo ra như thế nào ngay từ đầu?
Mặc dù bạn có thể sử dụng một bean CommandLineRunner để nạp trước cơ sở dữ liệu với một số dữ liệu taco thử nghiệm, nhưng cuối cùng dữ liệu taco sẽ đến từ người dùng khi họ tự tạo ra các chiếc taco của mình. Do đó, chúng ta sẽ cần viết một phương thức trong TacoController để xử lý các yêu cầu chứa thiết kế taco và lưu chúng vào cơ sở dữ liệu. Bằng cách thêm phương thức postTaco() sau vào TacoController, bạn cho phép controller thực hiện chính xác điều đó:
@PostMapping(consumes="application/json")
@ResponseStatus(HttpStatus.CREATED)
public Taco postTaco(@RequestBody Taco taco) {
return tacoRepo.save(taco);
}Vì postTaco() sẽ xử lý một yêu cầu HTTP POST, nên nó được đánh dấu bằng @PostMapping thay vì @GetMapping. Bạn không chỉ định thuộc tính đường dẫn ở đây, vì vậy phương thức postTaco() sẽ xử lý các yêu cầu đến /api/tacos như đã được chỉ định trong @RequestMapping ở cấp lớp của TacoController.
Tuy nhiên, bạn có thiết lập thuộc tính consumes. Thuộc tính consumes đối với dữ liệu đầu vào cũng giống như produces đối với dữ liệu đầu ra. Ở đây, bạn sử dụng consumes để nói rằng phương thức này sẽ chỉ xử lý các yêu cầu có Content-type là application/json.
Tham số Taco của phương thức được đánh dấu bằng @RequestBody để chỉ ra rằng phần thân của yêu cầu nên được chuyển đổi thành một đối tượng Taco và gán vào tham số đó. Annotation này rất quan trọng — nếu không có nó, Spring MVC sẽ giả định rằng bạn muốn ánh xạ các tham số của yêu cầu (dù là query parameter hay form parameter) vào đối tượng Taco. Nhưng @RequestBody đảm bảo rằng dữ liệu JSON trong phần thân của yêu cầu sẽ được ánh xạ vào đối tượng Taco.
Sau khi postTaco() nhận được đối tượng Taco, nó sẽ truyền đối tượng đó cho phương thức save() của TacoRepository.
Bạn cũng có thể nhận thấy rằng tôi đã đánh dấu phương thức postTaco() bằng @ResponseStatus(HttpStatus.CREATED). Trong điều kiện bình thường (khi không có ngoại lệ xảy ra), tất cả các phản hồi sẽ có mã trạng thái HTTP là 200 (OK), cho biết yêu cầu đã được xử lý thành công. Mặc dù phản hồi HTTP 200 luôn được chấp nhận, nhưng nó không phải lúc nào cũng đủ mô tả. Trong trường hợp của một yêu cầu POST, mã trạng thái HTTP 201 (CREATED) sẽ mô tả rõ ràng hơn. Nó thông báo cho client rằng không chỉ yêu cầu đã được xử lý thành công mà còn có một tài nguyên mới được tạo ra từ đó. Việc sử dụng @ResponseStatus một cách phù hợp luôn là một ý tưởng hay để truyền tải mã trạng thái HTTP rõ ràng và chính xác nhất đến client.
Mặc dù bạn đã sử dụng @PostMapping để tạo ra một tài nguyên Taco mới, nhưng các yêu cầu POST cũng có thể được sử dụng để cập nhật tài nguyên. Tuy vậy, các yêu cầu POST thường được dùng để tạo mới tài nguyên, còn các yêu cầu PUT và PATCH được sử dụng để cập nhật tài nguyên. Hãy cùng xem cách bạn có thể cập nhật dữ liệu bằng cách sử dụng @PutMapping và @PatchMapping.
