目录
1、RESTful概念
Restful就是一个
资源定位
及资源操作
的风格。
- 不是标准也不是协议,只是一种风格。
- 基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
2、RESTful功能
资源
:互联网所有的事物都可以被抽象为资源资源操作
:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。- 分别对应 添加、 删除、修改、查询。
3、对比:传统方式操作资源
通过不同的
参数
来实现不同的效果!
http://127.0.0.1/user/query?id=1 ;查询用户(GET)
http://127.0.0.1/user/add ;新增用户(POST)
http://127.0.0.1/user/update ;更新用户(POST)
http://127.0.0.1/user/delete?id=1 ;删除用户(GET或POST)
分析:
- 这种方式请求方式单一,只有
post
和get
两种请求方式 - 且不太安全,传入的参数和名称,直接暴露在url中
- 若想实现不同的业务,每次发起不同的请求,就对应了不同处理代码:
- 例如要查询用户,则通过
GET
方式请求/query
路径,对应相应的处理代码 - 例如要新增用户,则通过
POST
方式请求/add
路径,对应相应的处理代码 - 例如要更新用户,则通过
POST
方式请求/update
路径,对应相应的处理代码 - 例如要删除用户,则通过
POST
/GET
方式请求/update
路径,对应相应的处理代码
- 例如要查询用户,则通过
4、SpringMVC实现传统方式操作资源
我们在上述实验环境用注解开发SpringMVC详细配置中进行测试
在 HelloController.java
中添加一个add方法
目的:传入两个参数,在页面上显示两数的和
@RequestMapping("/add")
public String add(int a, int b, Model model) {
int result = a + b;
model.addAttribute("msg", "结果为" + result);
return "hello";
}
我们测试运行:通过传统的方式操作资源,访问http://localhost:8080/add?a=1&b=2
成功显示结果,如果我们想通过RestFul方式实现呢?
5、使用RestFul操作资源
可以通过不同的
请求方式
来实现不同的效果!
-
GET
:用于查询资源 -
POST
:用于创建资源 -
PUT
:用于更新服务端的资源的全部信息 -
PATCH
:用于更新服务端的资源的部分信息 -
DELETE
:用于删除服务端的资源。
如下:请求地址一样,但是功能可以不同!
http://127.0.0.1/user/1 ;查询用户(GET)
http://127.0.0.1/user ;新增用户(POST)
http://127.0.0.1/user ;更新用户(PUT)
http://127.0.0.1/user/1 ;删除用户(DELETE)
分析:
-
RESTful风格很简单,想要实现不同的功能,直接设置不同的请求方式
- 例如要查询用户,就使用
GET
请求 - 例如要新增用户,就使用
POST
请求 - 例如要更新用户,就使用
PUT
请求 - 例如要删除用户,就使用
DELETE
请求
- 例如要查询用户,就使用
-
RESTful相比传统方式更加安全,没有暴露处传入参数的名称
6、SpringMVC实现RESTful操作资源
接下来我们使用RestFul风格操作资源做相应的测试,同样求两个数的加和显示
- 在传入前端的每个参数前面增加
@PathVaribale
注解 @RequestMapping
注解中加上取参数符号
@RequestMapping("/add/{a}/{b}")
public String add(@PathVariable int a, @PathVariable int b, Model model) {
int result = a + b;
model.addAttribute("msg", "结果为" + result);
return "hello";
}
重新启动Tomcat运行测试,访问http://localhost:8080/add/1/2
成功显示,这就是通过RestFul风格
操作资源,传入的1对应了a的值,传入的2对应了b的值
我们知道,所有地址栏请求默认都会是 HTTP GET 类型的,那如果我们想使用其他的请求方式呢?
其中RequestMethod是一个枚举类,其中内置了很多请求的类型
我们修改以下代码,在@RequestMapping
注解中设置method属性为指定的请求类型,这里设置为DELETE
@RequestMapping(value = "/add/{a}/{b}", method = RequestMethod.DELETE)
public String add(@PathVariable int a, @PathVariable int b, Model model) {
int result = a + b;
model.addAttribute("msg", "结果为" + result);
return "hello";
}
再次重启Tomcat运行测试,同样请求http://localhost:8080/add/1/2
发现报错,这是因为这个请求应该是以GET
方式进行请求的,而我们设置成DELETE
方式
此时,设置method
请求类型为GET
,再次重启Tomcat运行测试,即可正确显示
@RequestMapping(value = "/add/{a}/{b}", method = RequestMethod.GET)
public String add(@PathVariable int a, @PathVariable int b, Model model) {
int result = a + b;
model.addAttribute("msg", "结果为" + result);
return "hello";
}
同样,我们可以设置多个方法,在@RequestMapping
中设置value
访问路径为同一个路径,但是设置请求方式为不同的请求方式,这就上述请求地址一样,但是功能不同的实现;
7、总结
Spring MVC 的
@RequestMapping
注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。
还有一些组合注解,是方法级别的注解变体:
@GetMapping //使用Get方式请求
@PostMapping //使用Post方式请求
@PutMapping //使用Put方式请求
@DeleteMapping //使用Delete方式请求
@PatchMapping //使用Patch方式请求
如:以下代码就设置了通过GET
方式进行请求,就不用通过@RequestMapping
的method属性设置了
- 等价于是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
@GetMapping("/hello")
public String hello2(Model model) {
model.addAttribute("msg", "This is the second request");
return "hello";
}