哈喽,大家好呀!这里是码农后端。RESTful在我们开发过程中可以说是再常见不过的了,但可能有一些新手小伙伴在刚开始学的时候会有一些疑惑,因为里面涉及到了较多的与操作相关的注解,因此,这里就来简单地总结一下,希望能有所帮助。
REST (Representational State Transfer),即表现形式状态转换。是一种基于HTTP协议的软件架构风格,用于设计Web API,可以降低开发的复杂性,提高系统的可伸缩性。
1)传统的资源描述形式
http://localhost/user/getById?id=1 ==> 查询id为1的用户(按id查询)
http://localhost/user/saveUser ==> 保存(新增)一个用户信息
2)REST风格描述形式
http://localhost/user/1 ==> 查询/删除id为1的用户
http://localhost/user ==> 保存(新增)/修改一个用户信息
从上述两种形式的对比,可以明显得知REST风格具有的优点:可以隐藏资源的访问行为,无法通过地址得知对资源是何种操作;并且也能简化书写。
RESTful:是指根据REST风格对资源进行访问。
我们根据REST风格访问资源时使用的行为动作,来区分对资源进行了何种操作。举例如下:
URL | 代表含义 |
---|---|
http://localhost/users | 查询全部用户信息 GET(查询) |
http://localhost/users/1 | 查询指定用户信息 GET(查询) |
http://localhost/users | 添加用户信息 POST(新增/保存) |
http://localhost/users | 修改用户信息 PUT(修改/更新) |
http://localhost/users/1 | 删除用户信息 DELETE(删除) |
通过上表可以看出,不同操作的URL可能是相同的,所以就不能单纯的通过URL地址来区分是何种操作,还需要通过响应的行为动作(请求方法)加以区分。
常用的请求方法:GET(查询)、POST(新增/保存)、PUT(修改/更新)、DELETE(删除)
为什么称其为REST风格而不是REST规范呢?
因为这些行为只是一种约定方式,并不是规范。也没有规定说一定要遵循,只不过是大家都认同,都这么使用而已,也差不多算是一种约定俗成了。
描述模块的名称通常使用复数,用于表示某类资源,如: users、books等
1)设定 http请求动作(动词)
2)设定请求参数(路径变量)
1)@RequestMapping
@RequestMapping | 说明 |
---|---|
类型 | 方法注解 |
位置 | SpringMVC控制器方法定义上方 |
作用 | 设置当前控制器方法请求访问路径 |
属性 | value(默认):请求访问路径 method:http请求动作,标准动作(GET/POST/PUT/DELETE) |
2)@PathVariable
@PathVariable | 说明 |
---|---|
类型 | 形参注解 |
位置 | SpringMVC控制器方法形参定义前面 |
作用 | 绑定路径参数与处理器方法形参间的关系(要求路径参数名与形参名一一对应) |
1)用法总结
@RequestParam:用于接收url地址传参或表单传参
@RequestBody:用于接收 json数据
@ResponseBody:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。
@PathVariable:用于接收路径参数,使用{参数名称}描述路径参数
2)应用场景
1、当发送请求参数超过1个,以 json格式为主,此时一般使用@RequestBody
2、当发送非json格式数据,使用@RequestParam接收请求参数
3、采用RESTful进行开发,当参数数量较少时(如1个),可以采用@PathVariable接收请求路径变量,通常用于传递id值
package com.it.controller;
import com.it.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController2 {
@RequestMapping(value = "/users",method = RequestMethod.POST)
@ResponseBody
public String save(){ // 新增-保存
System.out.println("user save...");
return "{'module':'user save'}";
}
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE) // 设定 Http请求动作(method方法)
@ResponseBody
public String delete(@PathVariable Integer id){ // 删除 // 设定请求参数(路径变量 @PathVariable)
System.out.println("user delete..."+ id);
return "{'module':'user delete'}";
}
@RequestMapping(value = "/users/{user}",method = RequestMethod.PUT)
@ResponseBody
public String update(@PathVariable User user){ // 修改-更新
System.out.println("user update..."+ user);
return "{'module':'user update'}";
}
@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
@ResponseBody
public String getById(@PathVariable Integer id){ // 查询单个
System.out.println("user getById..."+ id);
return "{'module':'user getById'}";
}
@RequestMapping(value = "/users",method = RequestMethod.GET)
@ResponseBody
public String getAll(){ // 查询全部
System.out.println("user getAll...");
return "{'module':'user getAll'}";
}
}
上述代码示例写起来没问题,但是可以发现有些相似的代码冗余,能够提取简化。来看一下RESTful是如何简化开发的。
@RestController | 说明 |
---|---|
类型 | 类注解 |
位置 | 基于SpringMVC的RESTful开发控制器类定义上方 |
作用 | 设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解组合功能 |
属性 | value(默认):请求访问路径 method:http请求动作,标准动作(GET/POST/PUT/DELETE) |
注:@RestController = @ResponseBody + @Controller
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping
1)类型:方法注解
2)位置:基于SpringMVC的RESTful开发的控制器方法定义上方
3)作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求
4)属性:value (默认)-->请求访问路径
如下就是使用RESTful简化开发后的效果,注释掉的是之前的,形成对比。
package com.it.controller;
import com.it.domain.User;
import org.springframework.web.bind.annotation.*;
//@Controller
//@ResponseBody
@RestController // 2.上面两个合二为一
@RequestMapping("/users") // 1.注解放在类上(抽取共同的)
public class UserController2 {
//@RequestMapping(method = RequestMethod.POST)
@PostMapping // 3.代替上面一行,以下同理
public String save(){
System.out.println("user save...");
return "{'module':'user save'}";
}
//@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
@DeleteMapping("/{id}")
public String delete(@PathVariable Integer id){ // 删除
System.out.println("user delete..."+ id);
return "{'module':'user delete'}";
}
//@RequestMapping(value = "/{user}",method = RequestMethod.PUT)
@PutMapping("/{user}")
public String update(@PathVariable User user){ // 修改-更新
System.out.println("user update..."+ user);
return "{'module':'user update'}";
}
//@RequestMapping(value = "/{id}",method = RequestMethod.GET)
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){ // 查询单个
System.out.println("user getById..."+ id);
return "{'module':'user getById'}";
}
//@RequestMapping(method = RequestMethod.GET)
@GetMapping
public String getAll(){ // 查询全部
System.out.println("user getAll...");
return "{'module':'user getAll'}";
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。