👉 博客主页:准Java全栈开发工程师
👉 00年出生,即将进入职场闯荡,目标赚钱,可能会有人觉得我格局小、觉得俗,但不得不承认这个世界已经不再是以一条线来分割的平面,而是围绕财富旋转的球面,成为有钱人不是为了去掌控球体的转向,而是当有人恶意掌控时,努力保护好家人和自己。
REST 风格
一、REST 简介
1、什么是 REST
- REST( Representational State Transfer ),翻译成中文就是表现形式状态转换。
- REST 是一种软件架构风格,以该风格进行资源访问的方式称为 RESTful。
2、为什么使用 REST 风格
- 传统方式的 url 请求地址:
- http://localhost:8080/user/select
- http://localhost:8080/user/selectById?id=1
- REST 风格的 url 请求地址:
- http://localhost:8080/user
- http://localhost:8080/user/1
- 相比之后,有没有感觉 REST 风格的 url 地址更简洁一点呢?
3、REST 风格的优点
- 隐藏资源的访问行为,无法通过地址得知对资源是何种操作。
- 书写简化。
4、如何区分请求操作的类型
- 按照 REST 风格访问资源时所使用的行为动作来区分。
- 以 http://localhost/users 为例:
- 如果是 GET 请求,则表示查询全部的用户信息。
- 如果是 POST 请求,则表示新增或保存用户信息。
- 如果是 PUT 请求,则表示修改或更新用户信息。
- 以 http://localhost/users/1 为例:
- 如果是 GET 请求,则表示查询指定用户信息。
- 如果是 DELETE 请求,则表示删除指定用户信息。
- 常用的请求方式有四种:GET、POST、PUT、DELETE。
- GET 请求用于查询操作。
- POST 请求用于新增操作。
- PUT 请求用于修改操作。
- DELETE 请求用于删除操作。
二、RESTful 入门案例
1、传统方式定义方法
- 此处仅仅是为了介绍如何将增删改查方法修改为 RESTful 风格,所以每个方法的方法体里只打印了一条输出语句,具体的方法内容还需要根据项目需求编写。
@Controller
public class RESTController {
/**
* 新增用户信息
* @param user
* @return
*/
@RequestMapping("/save")
@ResponseBody
public String save(@RequestBody User user){
System.out.println("save ==> " + user);
return "{'msg':'qdxorigin save'}";
}
/**
* 根据ID删除用户
* @param id
* @return
*/
@RequestMapping(value = "/delete")
@ResponseBody
public String delete(Integer id){
System.out.println("delete ==> " + id);
return "{'msg':'qdxorigin delete'}";
}
/**
* 修改用户信息
* @param user
* @return
*/
@RequestMapping(value = "/update")
@ResponseBody
public String update(@RequestBody User user){
System.out.println("update ==> " + user);
return "{'msg':'qdxorigin update'}";
}
/**
* 根据ID查询信息
* @param id
* @return
*/
@RequestMapping("/getById")
@ResponseBody
public String getById(Integer id){
System.out.println("getById ==> " + id);
return "{'msg':'qdxorigin getById'}";
}
/**
* 查询全部用户信息
* @return
*/
@RequestMapping("/findAll")
@ResponseBody
public String findAll(){
System.out.println("findAll ... ");
return "{'msg':'qdxorigin findAll'}";
}
}
2、RESTful 风格
- 按照 GET 查询、POST 新增、PUT 修改、DELETE 删除的原则修改。
- 映射路径的命名规则一般为所操作实体类的名称加s,如:操作 User 实体,映射路径命名为 users。
@Controller
public class RESTController {
/**
* 新增用户信息
* @param user
* @return
*/
@RequestMapping(value = "/users",method = RequestMethod.POST)
@ResponseBody
public String save(@RequestBody User user){
System.out.println("save ==> " + user);
return "{'msg':'qdxorigin save'}";
}
/**
* 根据ID删除用户
* @param id
* @return
*/
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
System.out.println("delete ==> " + id);
return "{'msg':'qdxorigin delete'}";
}
/**
* 修改用户信息
* @param user
* @return
*/
@RequestMapping(value = "/users",method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user){
System.out.println("update ==> " + user);
return "{'msg':'qdxorigin update'}";
}
/**
* 根据ID查询信息
* @param id
* @return
*/
@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
@ResponseBody
public String getById(@PathVariable Integer id){
System.out.println("getById ==> " + id);
return "{'msg':'qdxorigin getById'}";
}
/**
* 查询全部用户信息
* @return
*/
@RequestMapping(value = "/users",method = RequestMethod.GET)
@ResponseBody
public String findAll(){
System.out.println("findAll ... ");
return "{'msg':'qdxorigin findAll'}";
}
}
- 看完之后有没有感觉到虽然使用 RESTful 开发,命名变得简单了,但是会发现有好多重复性的工作,如:每个方法上都会使用 @ResponseBody 注解;@RequestMapping 的 value 属性都含有 /users,且每个方法都需要指定 method 值。
- 感觉写的代码比传统方式还要多,于是有了下面的优化。
3、优化 RESTful (推荐)
优化一
- 使用 @RestController 注解代替 @Controller,同时可以去掉每个方法上的 @ResponseBody 注解。也就是说,@RestController 一个注解可以代替 @Controller + @ResponseBody。
优化二
- 在类上使用 @RequestMapping(“/users”) 指定前缀,这样在指定方法的映射路径是可以不再写 /users 这一层。
优化三
- 使用 @PostMapping、@GetMapping、@DeleteMapping、@PutMapping 注解 代替 @RequestMapping(value = " ",method = RequestMethod.XXXX) 这一长串代码。
@RestController
@RequestMapping("/users")
public class RESTController {
/**
* 新增用户信息
* @param user
* @return
*/
@PostMapping
public String save(@RequestBody User user){
System.out.println("save ==> " + user);
return "{'msg':'qdxorigin save'}";
}
/**
* 根据ID删除用户
* @param id
* @return
*/
@DeleteMapping("/{id}")
public String delete(@PathVariable Integer id){
System.out.println("delete ==> " + id);
return "{'msg':'qdxorigin delete'}";
}
/**
* 修改用户信息
* @param user
* @return
*/
@PutMapping
public String update(@RequestBody User user){
System.out.println("update ==> " + user);
return "{'msg':'qdxorigin update'}";
}
/**
* 根据ID查询信息
* @param id
* @return
*/
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
System.out.println("getById ==> " + id);
return "{'msg':'qdxorigin getById'}";
}
/**
* 查询全部用户信息
* @return
*/
@GetMapping
public String findAll(){
System.out.println("findAll ... ");
return "{'msg':'qdxorigin findAll'}";
}
}
- 优化后再来看是不是感觉简化的好多呢?!
补充:路径参数
单个路径参数
@DeleteMapping("/{id}")
public String delete(@PathVariable Integer id){
System.out.println("delete ==> " + id);
return "{'msg':'qdxorigin delete'}";
}
- 细心的小伙伴不难发现,在根据 ID 删除指定用户时,方法路径上出现了 {id} 结构,且形参上出现了 @PathVariable 注解,这是为了和路径匹配。
- 首先需要说明一点,{ } 中的名称和方法形参名必须保持一致。
- @PathVariable 注解用于接收路径参数并与形参绑定。
多个路径参数
- 如果我们路径上出现多个参数应该怎么办呢?比葫芦画瓢呗!
@DeleteMapping("/{id}/{name}")
public String delete(@PathVariable Integer id,@PathVariable String name){
System.out.println("delete ==> " + id + name);
return "{'msg':'qdxorigin delete'}";
}
👉 以上就是文章的全部内容啦,诸佬如果有任何建议都可以提哦。
👉 创作不易,如果觉得对您有帮助的话,欢迎关注✨点赞👍收藏📂哦。