@PutMapping、@PatchMapping、@DeleteMapping解析


1. @PutMapping

put请求是从客户端向服务端发送数据,但与post不同的是,put真正的目的其实是执行大规模的替换操作,而不是更新操作

假如,我们有一个订单,我想要更新某个订单的地址信息,这时,我们就可用put请求来完成操作。

@PutMapping("/{orderID}")
public Order putOrder(@RequestBody Order order){
    return repo.save(order)  //服务端用来保存更新的order
}

从语义上讲,put意味着"将数据放到这个URL上",其本质就是替换已有的数据。我们如果省略了订单上的某个属性,那么该属性的值就应该被NULL所替代,甚至订单中的某个物品的实体数据也应一起重新设置,否则它们将从订单中移除。


2. @PatchMapping

patch的目的是对资源数据打补丁或局部更新,举个栗子:

@PatchMapping(path="/{orderId}",consumes="application/json")
public Order patchOrder(@PathVariable("orderId") Long orderId,
                       @RequestBody Order patch){
    Order order = repo.findById(orderId).get();
    if(patch.getDeliveryName()!=null){
        order.setDeliveryName(patch.getDeliveryName());
    }
    ......   //下列都是类似的代码
    return repo.save(order);
}

上面的代码中,允许我们,只有当修改的内容非null时,才在本地数据库中的对应属性上修改,如果客户端没有改动,则属性不动,即对资源数据进行一个局部属性的更新,不会直接对整个实体进行更新。

注意,在GetMapping和PatchMapping中,引用的路径请求都是要变更的资源。


3. @DeleteMapping

有些时候,有的数据可能不再需要了,客户端可以通过HTTP DELETE请求来要移除某个资源。

而 @DeleteMapping 注解就能够非常便捷的声明能够处理DELETE请求的方法。举个栗子:

我们想要有一个能够删除订单资源的API,下面的方法就能实现这一点:

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

在这个方法中,真正负责删除订单的是里面的代码,@DeleteMapping指定deleteOrder()方法处理针对“/orders/{orderId}的DELETE请求。

在该方法中,需要注意的是,@ResponseStatus注解确保的是HTTP状态码为204。对于已经不存在的资源,我们没有必要返回任何的资源数据给客户端,因此DELETE请求中通常没有响应体,我们要以HTTP状态码的形式让客户端知道不要期望得到任何的内容。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐