一文解读如何应用 REST 对资源进行访问?

文章目录

  • [一、REST 简介](#一、REST 简介)
  • 二、涉及注解
    • [2.1 @RequestMapping](#2.1 @RequestMapping)
    • [2.2 @PathVariable](#2.2 @PathVariable)
    • [2.3 @RestController](#2.3 @RestController)
    • [2.4 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping](#2.4 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping)
    • [补充:@PathVariable、@RequestBody、@RequestParam 区别与应用](#补充:@PathVariable、@RequestBody、@RequestParam 区别与应用)
  • 三、REST风格案例

一、REST 简介

REST (Representational State Transfer) ,表现形式状态转换。

描述 传统风格 REST风格
查询用户 http://localhost/user/getById?id=1 http://localhost/user/1
保存用户 http://localhost/user/saveUser http://localhost/user

优点:书写简化;隐藏资源的访问行为,无法通过地址得知对资源是何种操作

按照 REST 风格访问资源时使用 行为动作 区分对资源进行了何种操作。

描述 访问路径 方式
查询全部用户信息 http://localhost/users GET (查询)
查询指定用户信息 http://localhost/users/1 GET (查询)
添加用户信息 http://localhost/users POST(新增/保存)
修改用户信息 http://localhost/users PUT(修改/更新)
删除用户信息 http://localhost/users/1 DELETE (删除)

注:① 上述行为是约定方式,约定不是规范,可以打破,所以称 REST 风格,而不是 REST 规范。

② 描述模块的名称通常使用复数,也就是加 s 的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts...

根据 REST 风格对资源进行访问称为 RESTFUL。


二、涉及注解

2.1 @RequestMapping

  • 类型 :方法注解

  • 位置:SpringMVC 控制器上方、控制器方法上方

  • 作用:设置当前控制器方法请求访问路径

  • 属性value (默认):请求访问路径
        method :http 请求动作,标准动作(GET/POST/PUT/DELETE)

  • 举例

    java 复制代码
    @RequestMapping(value = "/users", method = RequestMethod.POST)
    @ResponseBody
    public String save(@RequestBody User user){
        System.out.println("user save ... " + user);
        return "{'module':'user save'}";
    }

2.2 @PathVariable

  • 类型 :方形参注解

  • 位置:SpringMVC 控制器方法形参定义前面

  • 作用 :绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

  • 举例

    java 复制代码
    @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user delete ... " + id);
        return "{'module':'user delete'}";
    }

2.3 @RestController

  • 类型 :类注解

  • 位置:SpringMVC 控制器定义上方

  • 作用 :设置当前控制器类为 RESTFUL 风格,等同于 @Controller 与 @ResponseBody 两个注解组合功能

  • 举例

    java 复制代码
    @RestController
    @RequestMapping("/users")
    public class UserController2 {
    	...
    }

2.4 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

  • 类型 :方法注解

  • 位置:SpringMVC 的 RESTFUL 开发的控制器方法定义上方

  • 作用 :设置当前控制器方法 请求访问路径与请求动作,每种对应一个请求动作。

  • 举例 :GetMapping 对应 GET请求

    java 复制代码
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("user getById ... " + id);
        return "{'module':'user getById'}";
    }

注: @GetMapping("/{id}") 的作用相当于 @RequestMapping(value = "/{id}", method = RequestMethod.GET)(当注解里面要定义两个属性时,value 这个属性名要写出来),其余注解同理。


补充:@PathVariable、@RequestBody、@RequestParam 区别与应用

  • 区别 :① @RequestParam 用于接收 url 地址传参或表单传参。
       ② @RequestBody 用于接收 json 数据。
       ③ @PathVariable 用于接收路径参数,使用(参数名称)描述路径参数。
  • 应用 :① 当请求参数数量较少时,可以采用 @Pathvariable 接收请求路径变量,通常用于传递 id 值。
       ② 当请求参数超过 1 个时,以 json 格式为主,通常使用 @RequestBody。
       ③ 如果发送非 json 格式数据,选用 @RequestParam 接收请求参数。

三、REST风格案例

REST 风格案例1:

java 复制代码
@Controller
public class UserController {

    @RequestMapping(value = "/users", method = RequestMethod.POST)
    @ResponseBody // 返回 json 形式
    public String save(@RequestBody User user){
        System.out.println("user save ... " + user);
        return "{'module':'user save'}";
    }

    @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user delete ... " + id);
        return "{'module':'user delete'}";
    }

    @RequestMapping(value = "/users", method = RequestMethod.PUT)
    @ResponseBody
    public String update(@RequestBody 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'}";
    }
}

基于案例1的改造:

java 复制代码
@RestController
@RequestMapping("/users")
public class UserController2 {

    //@RequestMapping(value = "/users", method = RequestMethod.POST)
    @PostMapping
    public String save(@RequestBody User user){
        System.out.println("user save ... " + user);
        return "{'module':'user save'}";
    }

    //@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
    @DeleteMapping("/{id}")
    public String delete(@PathVariable Integer id){
        System.out.println("user delete ... " + id);
        return "{'module':'user delete'}";
    }

    //@RequestMapping(value = "/users", method = RequestMethod.PUT)
    @PutMapping
    public String update(@RequestBody User user){
        System.out.println("user update ... " + user);
        return "{'module':'user update'}";
    }

    //@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("user getById ... " + id);
        return "{'module':'user getById'}";
    }

    //@RequestMapping(value = "/users", method = RequestMethod.GET)
    @GetMapping
    public String getAll(){
        System.out.println("user getAll");
        return "{'module':'user getAll'}";
    }
}

参考链接:黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)

相关推荐
LuckyLay8 分钟前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
Stringzhua14 分钟前
【SpringCloud】Kafka消息中间件
spring·spring cloud·kafka
向阳121821 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
Gu Gu Study30 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
WaaTong1 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048441 小时前
初识Java EE和Spring Boot
java·java-ee
AskHarries1 小时前
Java字节码增强库ByteBuddy
java·后端
佳佳_1 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
小灰灰__1 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭1 小时前
Java中的动态代理
java·开发语言·aop·动态代理