6.1.4 从服务器删除数据

有时数据根本就不再需要了。在这些情况下,客户端需要发起 HTTP DELETE 请求删除资源。

Spring MVC 的 @DeleteMapping 可以方便地声明处理 DELETE 请求的方法。例如,假设需要 API 允许删除订单资源,下面的控制器方法应该可以做到这一点:

@DeleteMapping("/{orderId}")
@ResponseStatus(code=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。但是还可以做一些事情来让客户端更容易地使用这个 API。接下来,让我们看看如何将超媒体添加到 Taco Cloud API 中。

最后更新于