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 风格,而不是 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
| @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
|
@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
| @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
|
@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
| @RequestMapping(value = "/users",method = RequestMethod.GET) @ResponseBody public String getAll(){ System.out.println("user getAll..."); return "{'module':'user getAll'}"; }
|
总结
- 设定 http 请求动作:
@RequestMapping
的 mathod 属性设置请求动作
- 设定请求参数(路径变量)
@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
|
@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
| @DeleteMapping("/{id}") 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 页面数据交互总结
- 先做后台功能,开发接口并调通接口
- 再做页面异步调用,确认功能可以正常访问
- 最后完成页面数据展示