Spring MVC——Rest风格

news2024/11/17 12:32:08

REST(Representational State Transfer)

  • 当我们想表示一个网络资源的时候,可以使用两种方式:
    我们分别用查询id为1的用户信息保存用户信息举例
  • 传统风格资源描述形式
    • http://localhost/user/getById?id=1
    • http://localhost/user/saveUser
  • REST风格描述形式
    • http://localhost/user/1
    • http://localhost/user

对比很明显吧,传统方式一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,因为我们可以通过读取请求url地址,就大概知道该url实现的是一个什么样的操作。而REST风格的描述,请求地址变的简单了,并且光看请求URL并不能猜出来该URL的具体功能,总结一下无非两个优点:

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

随之而来我们又有了一个新的问题,一个相同的url地址即可以是新增也可以是修改或者查询,那么到底我们该如何区分该请求到底是什么操作。

  • 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
    • http://localhost/users 查询全部用户信息 GET(查询)
    • http://localhost/users/1 查询指定用户信息 GET(查询)
    • http://localhost/users 添加用户信息 POST(新增/保存)
    • http://localhost/users 修改用户信息 PUT(修改/更新)
    • http://localhost/users/1 删除用户信息 DELETE(删除)

请求的方式比较多,但是比较常用的就4种,分别是GET:用来做查询,POST:用来做新增,PUT:用来做修改,DELETE:用来做删除。

注意注意注意注意

  • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
    • REST提供了对应的架构方式,按照这种架构设计项目可以降低开发的复杂性,提高系统的可伸缩性
    • REST中规定GET/POST/PUT/DELETE针对的是查询/新增/修改/删除,但是我们如果非要用GET请求做删除,这点在程序上运行是可以实现的
  • 但是如果绝大多数人都遵循这种风格,你写的代码让别人读起来就有点莫名其妙了。
  • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts…

既然清楚了什么是REST风格后,现在我们提一个新的概念RESTful根据REST风格对资源进行访问称为RESTful

对比一下请求吧一个是放在页面url路径里,一个是使用一些请求参数方法修改
在这里插入图片描述

名称@PathVariable
类型形参注解
位置SpringMVC控制器方法形参定义前面
作用绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

关于接收参数,三个注解@RequestBody@RequestParam@PathVariable

  • 区别
    • @RequestParam用于接收url地址传参或表单传参
    • @RequestBody用于接收json数据
    • @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
  • 应用
    • 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
    • 如果发送非json格式数据,选用@RequestParam接收请求参数
    • 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

其实我们实际开发REST风格并没有这么繁琐,我们看个例子就很明显了:

package com.taro.controller;

import com.taro.domain.Book;
import org.springframework.web.bind.annotation.*;

//@Controller
//@ResponseBody配置在类上可以简化配置,表示设置当前每个方法的返回值都作为响应体
//@ResponseBody
@RestController     //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
@RequestMapping("/books")
public class BookController {

//    @RequestMapping( method = RequestMethod.POST)
    @PostMapping        //使用@PostMapping简化Post请求方法对应的映射配置
    public String save(@RequestBody Book book){
        System.out.println("book save..." + book);
        return "{'module':'book save'}";
    }

//    @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)
    @DeleteMapping("/{id}")     //使用@DeleteMapping简化DELETE请求方法对应的映射配置
    public String delete(@PathVariable Integer id){
        System.out.println("book delete..." + id);
        return "{'module':'book delete'}";
    }

//    @RequestMapping(method = RequestMethod.PUT)
    @PutMapping         //使用@PutMapping简化Put请求方法对应的映射配置
    public String update(@RequestBody Book book){
        System.out.println("book update..."+book);
        return "{'module':'book update'}";
    }

//    @RequestMapping(value = "/{id}" ,method = RequestMethod.GET)
    @GetMapping("/{id}")    //使用@GetMapping简化GET请求方法对应的映射配置
    public String getById(@PathVariable Integer id){
        System.out.println("book getById..."+id);
        return "{'module':'book getById'}";
    }

//    @RequestMapping(method = RequestMethod.GET)
    @GetMapping             //使用@GetMapping简化GET请求方法对应的映射配置
    public String getAll(){
        System.out.println("book getAll...");
        return "{'module':'book getAll'}";
    }
}

名称@RestController
类型类注解
位置基于SpringMVC的RESTful开发控制器类定义上方
作用设置当前控制器类为RESTful风格,
等同于@Controller与@ResponseBody两个注解组合功能
名称@GetMapping @PostMapping @PutMapping @DeleteMapping
类型方法注解
位置基于SpringMVC的RESTful开发控制器方法定义上方
作用设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,
例如@GetMapping对应GET请求
相关属性value(默认):请求访问路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/504482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五届河南省CCPC河南省省赛题解+复盘

第五届河南省CCPC河南省省赛题解复盘 今年省赛相当有意思的一点,是20级第一次线下省赛,对于部分队也可能是最后一次,看队名就能看出来很多 考研就业的选手,一群老年人在这PK,氛围挺不错。 A - 小水獭游河南 — 签到 …

代码随想录算法训练营day28 | 93.复原IP地址,78.子集,90.子集II

代码随想录算法训练营day28 | 93.复原IP地址,78.子集,90.子集II 93.复原IP地址解法一:回溯 78.子集解法一:回溯(单独处理空集)解法二:回溯(统一处理空集) 90.子集II解法一…

Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

socket socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)…

NeurIPS 2022 | 正则化分子构象场

编译 | 于洲 今天我们介绍来自复旦大学的Lihao Wang以及其他来自字节跳动AI实验室与清华大学AI产业研究院的成员发布在NeurIPS 2022会议上的工作,该文章介绍了一种新方法——正则化分子构象场(RMCF),用于从化学结构中预测最有利的…

为什么聊天机器人界面不是未来

​ 0-1之间有无限多种状态 比如:0 按时上下班,用固定时间长度获取价值1 创业,用非线性时间,获取真实价值0-1 之间有无限多种状态 shadow ChatBot目前的交互界面有非常多值得被改进的体验机会。最近看到一篇非常有启发性的文章&…

【JY】浅析基于性能的抗震分析方法——性能设计

【写在前文】 在阅读此文前,可先看下以下文章: 【JY】基于性能的抗震设计(一) 【JY】基于性能的抗震设计(二) 【JY|理念】结构概念设计之(设计理念进展) 【性能设计】 建筑结构通常使用弹性分析进行抗震设计…

ProbTransformer:应对RNA折叠等自然过程数据模糊的神秘力量

编译 | 于洲‍ 今天我们介绍来自德国弗赖堡大学计算机科学系的Jrg K.H. Franke, Frederic Runge以及Frank Hutter发表在NeurIPS 2022会议上的工作,该文章介绍了一种新颖的基于概率的神经网络架构ProbTransformer,它是Transformer生态系统的一种层级增强&…

wangzherongyao PMO

感谢【五一节】大家的相遇,总结下。 2023年05月02日,【第一组】组队开黑 我总结了下这天为什么打的那么好,首先赛季初段位在王者附近,大家心态重视程度也高,不轻敌,也不盲目,运营好兵线一步一步…

springboot2集成knife4j(swagger3)

springboot2集成knife4j(swagger3) springboot2集成knife4j(swagger3) 环境说明集成knife4j 第一步:引入依赖第二步:编写配置类第三步:放行相关资源 & 保证启动了knife4j第四步&#xff1a…

Lecture 14:Life-long Learning

目录 Catastrophic Forgetting 灾难性遗忘(Catastrophic Forgetting)的克服之道 Selective Synaptic Plasticity Additional Neural Resource Allocation Memory Reply 其他 Catastrophic Forgetting ——为什么今日的人工智慧无法成为天网?灾难性遗忘 Life…

将ssh发布密钥添加到服务器的ssh授权密钥中,但是为什么我仍然无法ssh登录到此服务器?

我已经将ssh发布密钥添加到服务器的ssh授权密钥中,但是为什么我仍然无法ssh登录到此服务器? 即使将ssh公钥添加到服务器的授权密钥中,您也可能无法通过SSH登录到服务器,这有几个原因: 1.服务器的authorized_keys文件的权限不正确…

DAY 56 MySQL数据库的索引

索引的概念 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于c语言的链表通过指针指向数据记录的内存地址)。 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行…

专业的媒体邀约服务

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体邀约是什么?专业的媒体邀约服务包含哪些内容?怎么选择合适的媒体邀约服务机构? 今天胡老师就跟大家分享下这方面你的经验。 一,媒体邀约…

【Java入门合集】第四章继承(三)

【Java入门合集】第四章继承(三) 博主:命运之光专栏:JAVA入门 学习目标 1.掌握继承性的主要作用、实现、使用限制; 2.掌握this和super的含义及其用法; 3.掌握方法覆写的操作; 4.掌握final关键字…

【Spring MVC】Web程序开发

文章目录 1. 什么是Spring MVC?2. 如何创建Spring MVC项目?3. 简单示例演示4. 路由接口映射4.1 RequestMapping4.2 GetMapping和PostMapping 5. 获取参数5.1 获取单个参数5.2 获取多个参数5.3 获取对象5.4 RequestParam参数重命名5.5 ResquestBody接收JS…

告别PPT手残党!这6款AI神器,让你秒变PPT王者!

如果你是一个PPT手残党,每每制作PPT总是让你焦头烂额,那么你一定需要这篇幽默拉风的推广文案! 我向你保证,这篇文案将帮助你发现6款AI自动生成PPT的神器,让你告别PPT手残党的身份,成为一名PPT王者。 无论…

GoogleOptions命令行参数解析工具

GoogleOptions命令行参数解析工具 GoogleOptions GoogleOptions GoogleOptions是来自 Bazel Project 的命令行参数解析器。将 com.google.devtools.common.options 包拆分为一个单独的 jar&#xff0c;用于通用实用程序。 环境搭建: 引入maven依赖 <dependency><gr…

如何在Windows 10上使用Kali Linux应用程序

Linux操作系统在一些企业中越来越受欢迎。有许多发行版&#xff0c;包括Mint、Ubuntu和Kali。Kali是最著名的Linux发行版之一&#xff0c;渗透测试人员通常使用它。Kali Linux配备了一系列免费的开源软件&#xff0c;成为渗透测试的理想选择。目前&#xff0c;安全专家和渗透测…

【Vue】学习笔记-CLI Todo-List案例

学习笔记-CLI Todo-List案例 Todo-List案例src/App.vuesrc/components/MyHeader.vuesrc/components/MyList.vuesrc/components/MyItem.vuesrc/components/MyFooter.vue Todo-List案例 组件化编码流程 拆分静态组件&#xff1a;组件要按照功能点拆分&#xff0c;命名不要与html…

VSCode 开发flutter 实现设备远程调试

目前只找到了安卓的调试方案&#x1f62c;。 安卓端&#xff1a; 1首先安装 ADB Commanads for VSCode扩展 并且必须确保ADB已经添加到系统环境变量中 如未添加请按照下面的方式添加&#xff0c;如添加请直接跳到下面。 2添加环境变量&#xff08;windows可参考&#xff0c…