哈喽,大家好呀!这里是码农后端。RESTful在我们开发过程中可以说是再常见不过的了,但可能有一些新手小伙伴在刚开始学的时候会有一些疑惑,因为里面涉及到了较多的与操作相关的注解,因此,这里就来简单地总结一下,希望能有所帮助。

一、REST

1、REST概述

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风格具有的优点:可以隐藏资源的访问行为,无法通过地址得知对资源是何种操作;并且也能简化书写

2、RESTful

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、使用步骤

1)设定 http请求动作(动词)
2)设定请求参数(路径变量)

2、相关注解说明

1)@RequestMapping

@RequestMapping 说明
类型 方法注解
位置 SpringMVC控制器方法定义上方
作用 设置当前控制器方法请求访问路径
属性 value(默认):请求访问路径
method:http请求动作,标准动作(GET/POST/PUT/DELETE)

2)@PathVariable

@PathVariable 说明
类型 形参注解
位置 SpringMVC控制器方法形参定义前面
作用 绑定路径参数与处理器方法形参间的关系(要求路径参数名与形参名一一对应)

3、注解小结

1)用法总结

@RequestParam:用于接收url地址传参或表单传参
@RequestBody:用于接收 json数据
@ResponseBody:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。
@PathVariable:用于接收路径参数,使用{参数名称}描述路径参数

2)应用场景

1、当发送请求参数超过1个,以 json格式为主,此时一般使用@RequestBody
2、当发送非json格式数据,使用@RequestParam接收请求参数
3、采用RESTful进行开发,当参数数量较少时(如1个),可以采用@PathVariable接收请求路径变量,通常用于传递id值

4、代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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简化开发

上述代码示例写起来没问题,但是可以发现有些相似的代码冗余,能够提取简化。来看一下RESTful是如何简化开发的。

1、相关注解说明

1.1 @RestController

@RestController 说明
类型 类注解
位置 基于SpringMVC的RESTful开发控制器类定义上方
作用 设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解组合功能
属性 value(默认):请求访问路径
method:http请求动作,标准动作(GET/POST/PUT/DELETE)

注:**@RestController = @ResponseBody + @Controller**

1.2 与增删改查相关的4个注解

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping

1)类型:方法注解
2)位置:基于SpringMVC的RESTful开发的控制器方法定义上方
3)作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求
4)属性:value (默认)–>请求访问路径

1.3 代码示例

如下就是使用RESTful简化开发后的效果,注释掉的是之前的,形成对比。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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'}";
}
}