【SpringMVC】REST风格

👉 博客主页:准Java全栈开发工程师
👉 00年出生,即将进入职场闯荡,目标赚钱,可能会有人觉得我格局小、觉得俗,但不得不承认这个世界已经不再是以一条线来分割的平面,而是围绕财富旋转的球面,成为有钱人不是为了去掌控球体的转向,而是当有人恶意掌控时,努力保护好家人和自己。

一、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'}";
    }

👉 以上就是文章的全部内容啦,诸佬如果有任何建议都可以提哦。
👉 创作不易,如果觉得对您有帮助的话,欢迎关注✨点赞👍收藏📂哦。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

准Java全栈开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值