什么是RESTful?相关的注解有哪些?

2024-04-17 21:49:05 浏览数 (3)

哈喽,大家好呀!这里是码农后端。RESTful在我们开发过程中可以说是再常见不过的了,但可能有一些新手小伙伴在刚开始学的时候会有一些疑惑,因为里面涉及到了较多的与操作相关的注解,因此,这里就来简单地总结一下,希望能有所帮助。

一、REST

1、REST概述

REST (Representational State Transfer),即表现形式状态转换。是一种基于HTTP协议的软件架构风格,用于设计Web API,可以降低开发的复杂性,提高系统的可伸缩性。

1)传统的资源描述形式

http://localhost/user/getById?id=1 ==> 查询id为1的用户(按id查询)

http://localhost/user/saveUser ==> 保存(新增)一个用户信息

2)REST风格描述形式

http://localhost/user/1 ==> 查询/删除id为1的用户

http://localhost/user ==> 保存(新增)/修改一个用户信息

从上述两种形式的对比,可以明显得知REST风格具有的优点:可以隐藏资源的访问行为,无法通过地址得知对资源是何种操作;并且也能简化书写

2、RESTful

RESTful:是指根据REST风格对资源进行访问。

二、操作类型

我们根据REST风格访问资源时使用的行为动作,来区分对资源进行了何种操作。举例如下:

URL

代表含义

http://localhost/users

查询全部用户信息 GET(查询)

http://localhost/users/1

查询指定用户信息 GET(查询)

http://localhost/users

添加用户信息 POST(新增/保存)

http://localhost/users

修改用户信息 PUT(修改/更新)

http://localhost/users/1

删除用户信息 DELETE(删除)

通过上表可以看出,不同操作的URL可能是相同的,所以就不能单纯的通过URL地址来区分是何种操作,还需要通过响应的行为动作(请求方法)加以区分。

常用的请求方法:GET(查询)、POST(新增/保存)、PUT(修改/更新)、DELETE(删除)

为什么称其为REST风格而不是REST规范呢?

因为这些行为只是一种约定方式,并不是规范。也没有规定说一定要遵循,只不过是大家都认同,都这么使用而已,也差不多算是一种约定俗成了。

描述模块的名称通常使用复数,用于表示某类资源,如: users、books等

三、相关注解

1、使用步骤

1)设定 http请求动作(动词)

2)设定请求参数(路径变量)

2、相关注解说明

1)@RequestMapping

@RequestMapping

说明

类型

方法注解

位置

SpringMVC控制器方法定义上方

作用

设置当前控制器方法请求访问路径

属性

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

2)@PathVariable

@PathVariable

说明

类型

形参注解

位置

SpringMVC控制器方法形参定义前面

作用

绑定路径参数与处理器方法形参间的关系(要求路径参数名与形参名一一对应)

3、注解小结

1)用法总结

@RequestParam:用于接收url地址传参或表单传参

@RequestBody:用于接收 json数据

@ResponseBody:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。

@PathVariable:用于接收路径参数,使用{参数名称}描述路径参数

2)应用场景

1、当发送请求参数超过1个,以 json格式为主,此时一般使用@RequestBody

2、当发送非json格式数据,使用@RequestParam接收请求参数

3、采用RESTful进行开发,当参数数量较少时(如1个),可以采用@PathVariable接收请求路径变量,通常用于传递id值

4、代码示例

代码语言:java复制
package com.it.controller;

import com.it.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController2 {
    @RequestMapping(value = "/users",method = RequestMethod.POST) 
    @ResponseBody
    public String save(){ // 新增-保存
        System.out.println("user save...");
        return "{'module':'user save'}";
    }

    @RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE) // 设定 Http请求动作(method方法)
    @ResponseBody
    public String delete(@PathVariable Integer id){ // 删除  // 设定请求参数(路径变量 @PathVariable)
        System.out.println("user delete..."  id);
        return "{'module':'user delete'}";
    }

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

四、RESTful简化开发

上述代码示例写起来没问题,但是可以发现有些相似的代码冗余,能够提取简化。来看一下RESTful是如何简化开发的。

1、相关注解说明

1.1 @RestController

@RestController

说明

类型

类注解

位置

基于SpringMVC的RESTful开发控制器类定义上方

作用

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

属性

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

注:@RestController = @ResponseBody @Controller

1.2 与增删改查相关的4个注解

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping

1)类型:方法注解

2)位置:基于SpringMVC的RESTful开发的控制器方法定义上方

3)作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求

4)属性:value (默认)-->请求访问路径

1.3 代码示例

如下就是使用RESTful简化开发后的效果,注释掉的是之前的,形成对比。

代码语言:java复制
package com.it.controller;

import com.it.domain.User;
import org.springframework.web.bind.annotation.*;

//@Controller
//@ResponseBody
@RestController // 2.上面两个合二为一
@RequestMapping("/users") // 1.注解放在类上(抽取共同的)
public class UserController2 {
    //@RequestMapping(method = RequestMethod.POST)
    @PostMapping // 3.代替上面一行,以下同理
    public String save(){
        System.out.println("user save...");
        return "{'module':'user save'}";
    }

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

    //@RequestMapping(value = "/{user}",method = RequestMethod.PUT)
    @PutMapping("/{user}")
    public String update(@PathVariable User user){ // 修改-更新
        System.out.println("user update..."  user);
        return "{'module':'user update'}";
    }

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

    //@RequestMapping(method = RequestMethod.GET)
    @GetMapping
    public String getAll(){ // 查询全部
        System.out.println("user getAll...");
        return "{'module':'user getAll'}";
    }
}

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

0 人点赞