(转)REST风格的请求

使用Rest前,首先说一说Rest请求方式的好处,首先就是面向资源URI,即http请求的路径,Rest规定中要求URI各层只能用名词不用动词,这样相比传统的get请求有利于传输数据的稳定性,数据的操作流程不会被人轻易看破,也便于团队开发,各种URI一目了然;

再通过固定的请求方式,对URI中的资源进行各种操作,常用的有:

 

GET:查询;
POST:新增;
PUT:修改;
DELETE:删除;
符合这种风格的http请求,我们就叫它RestFul;

 

这其中还涉及到一个概念,叫做幂等性,即对该URI多少次操作,返回的结果都是相同的。

因为POST是新增,因此理论上讲他不是幂等的,其他方法都是幂等的。

接下来是实战,spring-boot架构,写了一个测试类,使用postman进行http请求测试:

 

@RestController
public class UserController {
@RestController:这是spring-boot的注解:包含

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
说明它既是一个controller,同时支持rest风格

 

@PathVariable:自动将rest请求匹配到同名参数上

@ModelAttribute:自动将请求的form表单参数 组装成对象

@RequestBody:自动将请求的json参数 组装成对象

下面开始放码:

查询:
 

/**
* restful风格操作
* @param name
* @return
*/
@RequestMapping(value="/xx/{name}",method= RequestMethod.GET,produces="application/json;charset=UTF-8")
private String query( @PathVariable String name) {
String result = "查询一个名为"+name+"的结果";
return result;
}


新增:
 


 
/**
* 新增
* @param user
* @return
*/
@RequestMapping(value="/xx",method= RequestMethod.POST,produces="application/json;charset=UTF-8")
private String add(@RequestBody User user) {
String result = "新增一个名为"+user.getUsername()+",密码为"+user.getPassword()+"的结果";
return result;
}


删除:
 

/**
* 删除
* @param username
* @return
*/
@RequestMapping(value="/xx/{username}",method= RequestMethod.DELETE,produces="application/json;charset=UTF-8")
private String del(@PathVariable String username) {
String result = "删除一个名为"+username+"的结果";
return result;
}


修改:
为啥最后才说修改呢,因为有坑呗!

 

/**
* 修改
* @param user
* @return
*/
@RequestMapping(value="/xx",method= RequestMethod.PUT,produces="application/json;charset=UTF-8")
private String edit(@RequestBody User user) {
String result = "修改一个名为"+user.getUsername()+",密码为"+user.getPassword()+"的结果";
return result;
}
我们发现,post和put的参数由@ModelAttribute变成了@RequestBody;

这是因为我一开始通过postman模仿form表单提交【修改】,后台参数为null,百度之,众多高手,有的说spring不支持put请求,有的说form表单不支持PUT和DELETE,有的说需要个过滤器。

我也挨个试了一下,最后发现用json还是可以的:

 

于是有了这些总结,最后在提到一个小朋友:

PATCH:
理论上讲PUT所做的更新是对整个对象来说的,一般都是将整个对象传输到后台进行整体修改,如果我只有一个字段想要改变,也要这么做,有点浪费带宽,所以出现了PATCH:【局部更新】;

有人说PUT幂等,PATCH不幂等;

 

PUT把一个文件或资源放在一个特定的URI处,并且正好在那个URI处。如果该URI处已有文件或资源,则PUT 将替换该文件或资源。如果那里没有文件或资源,PUT 创建一个。PUT是幂等的,但矛盾的是PUT响应不可缓存。

POST将数据发送到特定的URI,并期望该URI处的资源处理该请求。此时,Web服务器可以确定如何处理指定资源上下文中的数据。POST方法不是幂等的,但只要服务器设置适当的Cache-Control和Expires标头,POST响应就可以缓存。

 

PUT或PATCH? 

PUT 用所提供的新表示替换整个资源,对于资源来讲当然是幂等的。

PATCH 使用提供的值替换源资源的一部分,当然这是很初级的理解。

相关的知识学习可以看我其他的博客,一起进步,感谢观看与留言。
---------------------
作者:小姚师傅
来源:CSDN
原文:https://blog.csdn.net/qq_34582693/article/details/79981742
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-03-14 21:14  老周的自习室  阅读(193)  评论(0编辑  收藏  举报