Skip to content

7.1.4 Xóa dữ liệu khỏi máy chủ

Đôi khi dữ liệu đơn giản là không còn cần thiết nữa. Trong những trường hợp đó, client nên có khả năng yêu cầu xóa một tài nguyên bằng cách gửi một yêu cầu HTTP DELETE.

Spring MVC cung cấp @DeleteMapping rất tiện lợi để khai báo các phương thức xử lý các yêu cầu DELETE. Ví dụ, giả sử bạn muốn API của mình cho phép xóa một tài nguyên đơn hàng. Phương thức controller sau đây sẽ thực hiện điều đó:

java
@DeleteMapping("/{orderId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteOrder(@PathVariable("orderId") Long orderId) {
  try {
    repo.deleteById(orderId);
  } catch (EmptyResultDataAccessException e) {}
}

Đến thời điểm này, ý tưởng về một annotation ánh xạ yêu cầu khác hẳn đã trở nên quen thuộc với bạn. Bạn đã từng thấy @GetMapping, @PostMapping, @PutMapping@PatchMapping — mỗi annotation chỉ định rằng một phương thức sẽ xử lý yêu cầu tương ứng với phương thức HTTP tương ứng. Có lẽ bạn cũng không ngạc nhiên khi biết rằng @DeleteMapping được sử dụng để chỉ định rằng phương thức deleteOrder() sẽ xử lý các yêu cầu DELETE đến /orders/{orderId}.

Phần mã trong phương thức là phần thực hiện công việc thực tế của việc xóa đơn hàng. Trong trường hợp này, nó lấy ID của đơn hàng, được cung cấp dưới dạng biến đường dẫn trong URL, và truyền nó cho phương thức deleteById() của repository. Nếu đơn hàng tồn tại khi phương thức đó được gọi, nó sẽ bị xóa. Nếu đơn hàng không tồn tại, một ngoại lệ EmptyResultDataAccessException sẽ được ném ra.

Tôi đã chọn cách bắt EmptyResultDataAccessException và không làm gì với nó. Lý do là nếu bạn cố xóa một tài nguyên không tồn tại, thì kết quả cũng giống như khi nó thực sự tồn tại trước đó và bị xóa—tức là tài nguyên đó không còn tồn tại. Việc nó có tồn tại trước đó hay không là không quan trọng. Ngoài ra, tôi cũng có thể viết phương thức deleteOrder() trả về một ResponseEntity, thiết lập body là null và mã trạng thái HTTP là NOT FOUND.

Điều duy nhất khác cần lưu ý trong phương thức deleteOrder() là nó được chú thích với @ResponseStatus để đảm bảo mã trạng thái HTTP phản hồi là 204 (NO CONTENT). Không cần gửi bất kỳ dữ liệu tài nguyên nào lại cho client đối với một tài nguyên không còn tồn tại, vì vậy phản hồi cho các yêu cầu DELETE thường không có nội dung và do đó nên sử dụng mã trạng thái HTTP để thông báo cho client rằng không nên mong đợi bất kỳ nội dung nào.

API Taco Cloud của bạn đang bắt đầu hình thành. Giờ đây, một client có thể được viết để tiêu thụ API này, trình bày nguyên liệu, chấp nhận đơn hàng và hiển thị các taco mới được tạo gần đây. Chúng ta sẽ nói về việc viết mã REST client ở phần sau, mục 7.3. Nhưng bây giờ, hãy xem một cách khác để tạo các endpoint REST API: tự động dựa trên repository của Spring Data.

Released under the MIT License.