@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状态码的形式让客户端知道不要期望得到任何的内容。
相关文章
暂无评论...