Springboot之RESTful风格

news2024/11/27 0:32:00

目录

1、概述:

1.1、传统风格的API:

1.2、RESTful风格的API:

1.3、GET、POST、PUT、DELETE:

2、RESTful风格相关的注解:

①@PathVariable,用来获取url中的数据;

②@GetMapping,接收get方式的请求;

③@PostMapping,接收和处理Post方式的请求;

④@PutMapping,接收put方式的请求;

⑤@DeleteMapping,接收delete方式的请求;

⑥@RestController复合注解, 是@Controller 和@ResponseBody组合;

3、样例代码:

3.1、案例:@PathVariable注解和@GetMapping注解的联合使用(查询资源)

3.2、案例:@PathVariable注解和@PostMapping注解的联合使用(创建资源)

3.3、案例:@PutMapping和@DeleteMapping:

4、请求路径冲突:

4.1、歧义:

4.2、解决:

 5、使用HiddenHttpMethodFilter过滤器,将post请求转为put ,delete


1、概述:

           Restful风格是一种软件架构风格、设计风格,而不是标准,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。它主要用于客户端和服务器交互类的软件。

1.1、传统风格的API:

(注意:POST、PUT、DELETE方式不能直接在URL的后面添加参数,否则就变成GET了)

                http://localhost:8080/myStudengt/addStudent?name=lisi&age=26

 1.2、RESTful风格的API:

        Restful风格与传统的有一些不同,传统的资源请求中只有Get以及Post两种方式来传递参数,而Restful风格将资源请求按照CRUD增删改查这基本的数据操作分成了四个基本传递方式:

  •         GET:        查询资源-- sql select
  •         POST:      创建资源-- sql insert
  •         PUT:         更新资源-- sql update
  •         DELETE:  删除资源-- sql delete

        其中,Put 和Delete是从Post中分离出来的,可以浅显的理解为Post的子集。浏览器默认不直接支持put 和 delete ,我们需要通过其他的方式能够间接的支持put 和 delete: 我们可以用post方式来模拟put 和 delete

         一句话说明REST : 用REST表示资源和对资源的操作,使用url表示资源,使用http请求表示对资源的CRUD操作。在互联网,使用的图片,视频,文本,网页等等都是资源。

1.3、GET、POST、PUT、DELETE:

GET: 查询资源 ---> sql select

        http://localhost:8080/myboot/student/1001    (处理单个资源)

        http://localhost:8080/myboot/students/1001/1002    (处理多个资源)

POST: 创建资源 ---> sql insert 

                http://localhost:8080/myboot/student

                在post请求中传递数据

        <form action = "http://localhost:8080/myboot/student" method = "post">
                 姓名:<input type = "text" name = "name"/> 

                 年龄: <input type = "text" name = "age"/>
        <form/>

PUT:更新资源 ---> sql update

浏览器不能直接支持put,所以先成post;然后使用一个隐藏域,把post请求变成真实的put

                更新要指明更新谁,比如说学生1,这个value才是真实的请求方式

<form action="http://localhost:8080/myboot/student/1" method="post">
	姓名:<input type="text" name="name" />
    年龄:<input type="text" name="age" />
    <input type="hidden" name="_method" value="PUT" />
</form>

 DELETE: 删除资源 ---> sql delete

<a href="http://localhost:8080/myboot/student/1">删除1的数据</a>

2、RESTful风格相关的注解:

@PathVariable,用来获取url中的数据;

        注:当路径变量名和形参名保持一致,@PathVariable中的value可以省略。

        @PutMapping("/modify/info/{name}/{age}")
        public String modifyStudent(@PathVariable String name,
                                    @PathVariable Integer age){
            return  "更新了资源Student,姓名为:" + name + "年龄为:" +age;
        }

        这个资源名称和学生id都是在url中,你用getParameter是拿不到这个数据的:

                       http://localhost:8080/myboot/students/1001/1002 

    http://localhost:8080/myStudengt/addStudent?name=lisi&age=26

                String name = request.getParameter("name");

                String age = request.getParameter("age");

@GetMapping,接收get方式的请求;

        等同于@RequestMapping( method=RequestMethod.GET)。

@PostMapping,接收和处理Post方式的请求;

        等同于@RequestMapping( method=RequestMethod.POST) 。

@PutMapping,接收put方式的请求;

        等同于 @RequestMapping( method=RequestMethod.PUT)。

@DeleteMapping,接收delete方式的请求;

        等同于 @RequestMapping( method=RequestMethod.DELETE)。

@RestController复合注解, 是@Controller 和@ResponseBody组合

        在类的上面使用@RestController , 表示当前类中的所有方法都加入了 @ResponseBody,使用这个注解将返回的资源数据制成JSON格式响应给客户端。

3、样例代码:

3.1、案例:@PathVariable注解和@GetMapping注解的联合使用(查询资源)
@RestController
public class RestfulControlller {

    @GetMapping("/query/info/{name}/{age}")
    //@PathVariable("name") String userName ,
    //@PathVariable("age")Integer userAge)
    public String queryStudent(@PathVariable(value = "name") String userName ,
                               @PathVariable(value = "age")Integer userAge){
        return "学生名字为:" + userName + "学生年龄为:" + userAge;
    }

}

 3.2、案例:@PathVariable注解和@PostMapping注解的联合使用(创建资源)
   @PostMapping("/create/info/{name}/{age}")
    public String createStudent(@PathVariable("name") String name ,
                                @PathVariable("age") Integer age){
        return "创建了资源Student,姓名为:" + name + "年龄为:" +age;
    }

        对于Post、Put、Delete都需要编写一个表单页面,比较麻烦,并且对于put和delete请求浏览器是不支持的;可以借助Postman工具 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>添加学生</h3>
    <form action="student/zhangsan/18" method="post">
        <input type="submit" value="注册学生">
    </form>
</body>
</html>
3.3、案例:@PutMapping和@DeleteMapping:
    @PutMapping("/modify/info/{name}/{age}")
    //当路径变量名和形参名保持一致,@PathVariable中的value可以省略。
    public String modifyStudent(@PathVariable String name,
                                @PathVariable Integer age){
        return  "更新了资源Student,姓名为:" + name + "年龄为:" +age;
    }

    @DeleteMapping("/delete/info/{id}")
    //当路径变量名和形参名保持一致,@PathVariable中的value可以省略。
    public String deleteStudent(@PathVariable  Integer id){
        return "删除资源Student:"+id;
    }

4、请求路径冲突:

4.1、歧义:

这样设置有歧义:以下两个请求,请求方式相同,资源名也相同,携带的数据类型也相同;

    @DeleteMapping("/delete/info/{stuid}")
    //当路径变量名和形参名保持一致,@PathVariable中的value可以省略。
    public String deleteStudent(@PathVariable("stuid")  Integer id){
        return "删除资源Student----@DeleteMapping:"+id;
    }

    @PostMapping("/delete/info/{id}")
    //当路径变量名和形参名保持一致,@PathVariable中的value可以省略。
    public String deleteStudent2(@PathVariable  Integer id){
        return "删除资源Student----@PostMapping:"+id;
    }
4.2、解决:

                        设计路径,必须唯一:(请求方式+路径uri)必须唯一!

 

 5、使用HiddenHttpMethodFilter过滤器,将post请求转为put ,delete

在SpringMVC中 有一个过滤器org.springframework.web.filter.HiddenHttpMethodFilter。

作用: 把请求中的post请求转为 put , delete。

        在springmvc框架中,你需要在web.xml文件中去配置这个过滤器,如果你是在springboot框架中,这个过滤器已经存在了,你只需要在application.properties(yml) : 开启使用HiddenHttpMethodFilter过滤器。在SpringBoot中默认是把这个组件已经配置好的,但是默认是关闭的,要想生效必须手动设置生效。

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

        不设置会报错:

 案例:

   @PutMapping("/myboot/student/{name}/{age}")
    public String putStudent(@PathVariable String name,
                             @PathVariable Integer age){
        return "使用Put请求方式,姓名为:"+name+",年龄为:"+age;
    }

    @DeleteMapping("/myboot/delStudent/{name}/{age}")
    public String delStudent(@PathVariable String name,
                             @PathVariable Integer age){
        return "使用delete请求方式,姓名为:"+name+",年龄为:"+age;
    }

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form id="myForm" action="" method="post">
    姓名:<input type="text" name="name" id="nameInput" />
    年龄:<input type="text" name="age" id="ageInput" />
    <input type="hidden" name="_method" value="PUT" />
</form>
<button type="button" onclick="submitForm()">测试更新</button>

<form  action="myboot/delStudent/张三/25" method="post">

    <input type="hidden" name="_method" value="delete" />
    <input type="submit" value="测试删除" />

</form>


<script>
    function submitForm() {
        // 获取用户输入的姓名和年龄
        var name = document.getElementById("nameInput").value;
        var age = document.getElementById("ageInput").value;

        // 构建表单的action URL,替换占位符{name}和{age}为实际的姓名和年龄
        var actionUrl = "/myboot/student/" + encodeURIComponent(name) + "/" + encodeURIComponent(age);

        // 设置表单的action属性为动态构建的URL
        document.getElementById("myForm").action = actionUrl;

        // 提交表单
        document.getElementById("myForm").submit();
    }
</script>

</body>
</html>

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

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

相关文章

Xcode删除原本的Git,再添加新的git

本文参考&#xff1a;Xcode怎么删除原本git,在重新设置新的git地址_ios xcode 删除原本git-CSDN博客 开发中会有一个问题。Xcode项目A 提交到Git服务器server1&#xff0c;此时项目A内部已经存在一个Git文件&#xff0c;与server1相关联。 此时你想将项目A提交到 另一个Git…

SSH免密登录——linux

SSH免密登录——linux 方法一一、用 ssh-key-gen 在本地主机上创建公钥和密钥二、用 ssh-copy-id 把客户端公钥追加到远程主机的 .ssh/authorized_key 上三、直接登录远程主机 方法二一、将生成的客户端公钥id_rsa.pub内容追加至目标主机.ssh/authorized_key 中参考链接 SSH免密…

论文阅读,Accelerating the Lattice Boltzmann Method(五)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)

我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…

程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享)

程序员/后端开发方向Java 跳槽注意事项&#xff08;简历和面试经验分享&#xff09; 应届生面试经验参考&#xff1a;https://www.cnblogs.com/rainbow-1/p/16779048.html 简历&#xff1a; 1、个人感觉还是要写真话&#xff0c;包装的内容要有一定的基础&#xff0c;问起来能…

数据结构——lesson13排序之计数排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

高炉项目中DeviceNET到Ethernet的转换奥秘

在工业自动化的世界中&#xff0c;高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议&#xff0c;扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁&#xff0c;更是实现信息高效传递的关键。今天&#xff0c;我们就来揭开从DeviceNET到…

解读langchain与详细步骤

langchain框架目前以python或javascript包的形式提供&#xff0c;具体来说是TypeScript。 假如你想从你自己的数据、你自己的文件中具体了解一些情况&#xff0c;它可以是一本书&#xff0c;一个pdf文件&#xff0c;一个包含专有信息的数据库。Langchain允许你将GPT-4这样的大…

Python版【植物大战僵尸 +源码】

文章目录 写在前面&#xff1a;功能实现环境要求怎么玩个性化定义项目演示&#xff1a;源码分享Map地图:Menubar.py主菜单 主函数&#xff1a;项目开源地址 写在前面&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是…

mybatis配置文件解析

可解析标签 configuration&#xff08;配置&#xff09; properties&#xff08;属性&#xff09;settings&#xff08;设置&#xff09;typeAliases&#xff08;类型别名&#xff09;typeHandlers&#xff08;类型处理器&#xff09;objectFactory&#xff08;对象工厂&#…

改变打分方法重新计算动态规划算法比对序列

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 动态规划 概念 动态规划法离不开一个关键词&#xff0c;拆分 &#xff0c;就是把求解的问题分解成若干个子阶段&#xff0c;前一问题的结…

算法学习——LeetCode力扣动态规划篇9

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

人工智能轨道交通行业周刊-第76期(2024.3.18-3.31)

本期关键词&#xff1a;铁科智合、信号机、列车供电方式、Voice Engine、3D数字人 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

spring-boot. 结合redis 实现消息队列

导入依赖jar包 <!-- redis 配置信息--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 实现消息监听接口 MessageListener\重写 onMessa…

发票是扫码验真好,还是OCR后进行验真好?

随着科技的进步&#xff0c;电子发票的普及使得发票的验真方式也在不断演进。目前&#xff0c;我们常见的发票验真方式主要有两种&#xff1a;一种是扫描发票上的二维码进行验真&#xff0c;另一种是通过OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别…

【Canvas与艺术】双齿轮啮合传动

【关键点】 双轮半径和线速度的比例以及差角的调试。 【截图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>大小齿轮联动…

ES6学习(四)

文章目录 1. Reflect1.1 代替Object 的某些方法1.2 修改某些Object 方法返回结果1.3 命令式变为函数行为1.4 ! 配合Proxy 2. ! Promise2.1 回调地狱2.2 Promise 使用2.3 Promise 对象的状态2.4 解决回调地狱的方法2.5 Promise.all2.6 Promise.race 3. Generator 函数3.1 基本语…

推荐一本牛逼的入门 Python书!,如何试出一个Python开发者真正的水平

本书详细解说了 Python 语言和编程的本质&#xff0c;无论你是否接触过编程语言&#xff0c;只要是 Python 编程的初学者&#xff0c;都可阅读本书。 本书讲解的内容虽然基础&#xff0c;但并不简单。本书提供了 165 幅图表&#xff0c;可以让大家能够轻松地理解并掌握复杂的概…

超强命令行解析工具Apache Commons CLI

概述 为什么要写这篇文章呢?因为在读flink cdc3.0源码的时候发现了这个工具包,感觉很牛,之前写过shell命令,shell是用getopts来处理命令行参数的,但是其实写起来很麻烦,长时间不写已经完全忘记了,现在才发现原来java也有这种工具类,所以先学习一下这个的使用,也许之后自己在写…

创建第一个Electron程序

前置准备 创建一个文件夹&#xff0c;如: electest进入文件夹&#xff0c;初始化npm npm init -y 安装electron依赖包 注&#xff0c;这里使用npm i -D electron会特别卡&#xff0c;哪怕换成淘宝源也不行。可以使用下面方式安装。 首先&#xff0c;安装yarn npm i -g yarn 随…