7.1.4 删除服务器上的数据
有时数据根本就不再需要了。在这些情况下,客户端需要发起 HTTP DELETE 请求删除资源。
Spring MVC 的 @DeleteMapping
可以方便地声明处理 DELETE 请求的方法。例如,假设需要 API 允许删除订单资源,下面的控制器方法应该可以做到这一点:
@DeleteMapping("/{orderId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteOrder(@PathVariable("orderId") Long orderId) {
try {
repo.deleteById(orderId);
} catch (EmptyResultDataAccessException e) {}
}
至此,另一个映射注解的思想对您来说应该已经过时了。您已经看到了 @GetMapping
、@PostMapping
、@PutMapping
和 @PatchMapping
—— 每一个都指定了一个方法应该处理对应的 HTTP 方法的请求。@DeleteMapping
用于 deleteOrder()
方法负责处理 /orders/{orderId}
的删除请求。
该方法中的代码实际用于执行删除订单操作。在本例中,它接受作为 URL 中的路径变量提供的订单 ID,并将其传递给存储库的 deleteById()
方法。如果调用该方法时订单存在,则将删除它。如果订单不存在,将抛出一个 EmptyResultDataAccessException 异常。
我选择捕获 EmptyResultDataAccessException 而不做任何事情。我的想法是,如果试图删除一个不存在的资源,其结果与在删除之前它确实存在的结果是一样的,也就是说,资源将不存在。它以前是否存在无关紧要。或者,我也可以编写 deleteOrder()
来返回一个 ResponseEntity,将 body 设置为 null,将 HTTP 状态代码设置为 NOT FOUND。
在 deleteOrder()
方法中需要注意的惟一一点是,它使用 @ResponseStatus
进行了注解,以确保响应的 HTTP 状态是 204(NO CONTENT)。对于不再存在的资源,不需要将任何资源数据发送回客户机,因此对删除请求的响应通常没有正文,因此应该发送一个 HTTP 状态代码,让客户机知道不需要任何内容。
Taco Cloud API 已经开始成形了,客户端代码现在可以轻松地使用这个 API 来显示配料、接受订单和显示最近创建的 tacos。我们将在 7.3 节讨论如何编写 REST 客户端。接下来,让我们看看如何将超媒体添加到 Taco Cloud API 中。