前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是RESTful?相关的注解有哪些?

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

原创
作者头像
reload
发布2024-04-17 21:49:05
1800
发布2024-04-17 21:49:05
举报
文章被收录于专栏:Java后端

哈喽,大家好呀!这里是码农后端。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腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、REST
    • 1、REST概述
      • 2、RESTful
      • 二、操作类型
      • 三、相关注解
        • 1、使用步骤
          • 2、相关注解说明
            • 3、注解小结
              • 4、代码示例
              • 四、RESTful简化开发
                • 1、相关注解说明
                  • 1.1 @RestController
                  • 1.2 与增删改查相关的4个注解
                  • 1.3 代码示例
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档