Rest 简明笔记

Rest 简介

Rest (Representation State Transfer, 表现形式状态转换),即访问网络资源的格式

传统风格资源描述形式书写如下

1
2
http://localhost/user/getById?id=1
http://localhost/user/saveUser

REST 风格描述形式如下

1
2
http://localhost/user/1
http://localhost/user

特点

  • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
  • 书写简化
  • 按照 REST 风格访问资源时使用行为动作区分对资源进行了何种操作
  • 根据 REST 风格对资源进行访问称为 RESTful

Rest风格增删改查.png

注意事项

  • 上述行为是约定方式,约定不是规范,可以打破,所以称 REST 风格,而不是 REST 规范
  • 描述模块的名称通常使用复数,也就是加 s 的格式描述,表示此类资源,而非单个资源,例如:users、books 等

Rest 入门案例

1、原先的风格

1
2
3
4
5
6
@RequestMapping("/save")  
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'user save'}";
}

2、REST 风格

1
2
3
4
5
6
7
//设置当前请求方法为POST,表示REST风格中的添加操作  
@RequestMapping(value = "/users",method = RequestMethod.POST)
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'user save'}";
}

删除

1
2
3
4
5
6
7
8
//设置当前请求方法为DELETE,表示REST风格中的删除操作  
//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
System.out.println("user delete..." + id);
return "{'module':'user delete'}";
}

注意 Postman 中的请求路径:

1
http://localhost//users/1

@PathVariable 表示后面的变量来自路径,但是来自路径中的哪儿呢?
而通过 value = "/users/{id}" 中就指明了路径参数(路径变量)

修改

1
2
3
4
5
6
7
//设置当前请求方法为PUT,表示REST风格中的修改操作  
@RequestMapping(value = "/users",method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user){
System.out.println("user update..."+user);
return "{'module':'user update'}";
}

根据 id 查询

1
2
3
4
5
6
7
8
//设置当前请求方法为GET,表示REST风格中的查询操作  
//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)
@ResponseBody
public String getById(@PathVariable Integer id){
System.out.println("user getById..."+id);
return "{'module':'user getById'}";
}

查询所有

1
2
3
4
5
6
7
//设置当前请求方法为GET,表示REST风格中的查询操作  
@RequestMapping(value = "/users",method = RequestMethod.GET)
@ResponseBody
public String getAll(){
System.out.println("user getAll...");
return "{'module':'user getAll'}";
}

总结

  1. 设定 http 请求动作:@RequestMapping 的 mathod 属性设置请求动作
  2. 设定请求参数(路径变量)
  3. @PathVariable 形参注解,用于绑定路径参数与处理器方法形参间的关系,要求路径参数名和形参名一一对应

@RequestBody:用于接收 json 数据
@RequestParam:接受 URL 地址传参或表单传参
@PathVariable:用于接收路径参数,使用 {参数名称} 描述路径参数

RESTful 快速开发

简化书写

1
2
3
@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)
@RequestMapping(value = "/users",method = RequestMethod.GET)
@RequestMapping(value = "/users",method = RequestMethod.PUT)

问题 1:可以看到,以上的这几个中 value = "/users" 都是重复要写的内容,能不能更简化呢?

1
2
3
4
5
@Controller
@RequestMapping("/books")
public class BookController {
//各种处理器方法
}

问题 2:每一个处理器方法前面都带着一个 @ResponseBody 注解,能不能更简化些呢?

@ResponseBody 写到类的前面

1
2
3
4
5
6
@Controller
@ResponseBody
@RequestMapping("/books")
public class BookController {
//各种处理器方法
}

Spring ⇒ 既然每次都得写 @Controller@ResponseBody,那就合二为一吧,使用 @RestController 即可

1
2
3
4
5
@RestController
@RequestMapping("/books")
public class BookController {
//各种处理器方法
}

问题 3:每个处理器方法中都有

1
2
3
4
method = RequestMethod.POST
method = RequestMethod.DELETE
method = RequestMethod.PUT
//...

那么能不能简化书写呢?

1
2
3
4
5
6
7
//@RequestMapping( method = RequestMethod.POST)  
//使用@PostMapping简化Post请求方法对应的映射配置
@PostMapping
public String save(@RequestBody Book book){
System.out.println("book save..." + book);
return "{'module':'book save'}";
}

也就是说,使用注解 @PostMapping 来实现前面 mathod 属性中的功能

那么对于含有路径参数的呢?比如 delete ⇒ @DeleteMapping("/{id}")

1
2
3
4
5
6
//@RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)  
@DeleteMapping("/{id}") //使用@DeleteMapping简化DELETE请求方法对应的映射配置
public String delete(@PathVariable Integer id){
System.out.println("book delete..." + id);
return "{'module':'book delete'}";
}
1
2
3
4
5
@PostMapping
@DeleteMapping("/{id}")
@PutMapping
@GetMapping
@GetMapping("/{id}")

页面数据展示

非本案例重点,这里省略操作

总结

基于 RESTful 页面数据交互总结

  • 先做后台功能,开发接口并调通接口
  • 再做页面异步调用,确认功能可以正常访问
  • 最后完成页面数据展示