Springboot之RESTful风格

目录

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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++教学——从入门到精通 6.ASCII码与字符型

如何把小写字母转换成大写字母呢&#xff1f; 这个问题问的好&#xff0c;首先我们要新学一个类型——char 这个类型就是字符型 再来说说ASCII码 给大家举几个例子 空格————32 0————48 9————57 A————65 Z————90 a————97 z————122 我们…

Cortex-M7中断向量表的重定向

1 前言 系统上电后&#xff0c;PC会指向复位向量&#xff0c;即向量表中的Reset_Handler&#xff0c;而系统就是通过Vector Table Offset Register (VTOR)的值加上4字节来找到复位向量的入口的。 因为地址 0 处应该存储引导代码&#xff0c;所以它通常映射到 Flash 或者是 ROM …

Unity类银河恶魔城学习记录11-14 p116 Thunder strike item effect源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ThurderStrike_Controller.cs using System.Collections; using System.C…

如何提高小红书笔记的收录率?

在小红书平台上&#xff0c;笔记的收录率是衡量一篇笔记是否受欢迎和有价值的重要因素。为了提高笔记的收录率&#xff0c;有几个关键点需要注意&#xff1a; 1.内容不涉及广告 在发布笔记前要先确保笔记内容不包含任何形式的广告或推广信息。小红书平台对于广告性质的内容有…

关于Ansible的模块②

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 接《关于Ansible的模块 ①-CSDN博客》&#xff0c;继续学习和梳理Ansible的常用文件类模块 1. copy模块 从当前机器上复制文件到…

关于 Unreal 的各种坐标系、输入与逻辑的转换问题

说明 已知&#xff1a; 在世界原点往 X 轴方向看去&#xff0c;ForwardVector 为 [ 1 , 0 , 0 ] [1,0,0] [1,0,0]&#xff0c;此时的右手边的方向为 [ 0 , 1 , 0 ] [0,1,0] [0,1,0] 手柄摇杆、鼠标移动朝右得到的 [ 1 , 0 , 0 ] [1,0,0] [1,0,0]&#xff0c;朝上得到的是…

代码随想录:字符串5-7

右旋字符串 题目 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字符移到字符串的前面&#xff0c;实现字符串的右旋转操作。 例如&#xff0c;对于输入字符…

货币与利率

货币与利率 货币及其职能什么是货币货币的职能货币带来了什么&#xff1f; 货币形式的演变商品货币代用货币信用货币货币的特性 现代社会货币的表现形式流通中的现金支票存款信用卡储存存款 货币层次划分目的划分标准划分种类我国的货币层次 货币与物价的关系利率什么是利息什么…

算法学习——LeetCode力扣补充篇1

算法学习——LeetCode力扣补充篇1 1365. 有多少小于当前数字的数字 1365. 有多少小于当前数字的数字 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个数组 nums&#xff0c;对于其中每个元素 nums[i]&#xff0c;请你统计数组中比它小的所有数字的数目。 换而言之&a…

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

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

Taro+vue3 监听当前的页面滚动的距离

1.需求 想实现一个这样的效果 一开始这个城市组件 是透明的 在顶部 的固定定位 当屏幕滑动的时候到一定的距离 将这个固定的盒子 背景颜色变成白色 2.Taro中的滚动 Taro中的滚动 有固定的api 像生命周期一样 这个生命周期是 usePageScroll import Taro, { useDidShow, useP…

外包干了5天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Django源码之路由的本质(上)——逐步剖析底层执行流程

目录 1. 前言 2. 路由定义 3. 路由定义整体源码分析 3.1 partial实现path函数调用 3.2 图解_path函数 3.3 最终 4.URLPattern和Pattern的简单解析 5. 小结 1. 前言 在学习Django框架的时候&#xff0c;我们大多时候都只会使用如何去开发项目&#xff0c;对其实现流程并…

【C++】位图

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;手撕哈希表的闭散列和开散列 > 毒鸡汤&#xff1a; 坚持不懈&#xff0c;才能在困难面前看到光明的希望。 > 专栏选自&#xff1a;C嘎嘎进阶 >…

基于单片机病房温度监测与呼叫系统设计

**单片机设计介绍&#xff0c;基于单片机病房温度监测与呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房温度监测与呼叫系统设计概要主要涵盖了通过单片机技术实现病房温度的实时监测以及病人呼叫功能…

java字符串(一)-- 字符串API,StringBuffer 和 StringBuilder,Object

String字符串相关的类 String的特性 String类&#xff1a;代表字符串。Java 程序中的所有字符串字面值&#xff08;如"abc" &#xff09;都作为此类的实例实现。String类是引用数据类型。 在 Java 8 中&#xff0c;String 内部使用 char 数组存储数据。 public fi…

C++入门知识点

目录 一、命名空间 1.命名空间的定义 2.命名空间的使用 二、输入和输出 三、缺省参数 1.缺省参数的概念 2.缺省参数的分类 1&#xff09;全缺省参数 2&#xff09;半缺省参数 四、函数重载 五、引用 1.引用的概念 2.引用的特性 3.引用和指针的区别 六、内联函…

gan zoo: 最新GAN 相关paper/code收集

相关推荐&#xff1a; 简单实现 GAN 简单实现 DCGAN 简单实现 InfoGAN 简单实现 Pix2Pix 一文带你读懂概率生成模型 GPT-1/GPT-2/GPT-3简介 GPT从0到1构建(附视频代码链接) 一文带你读懂变分自编码器(VAEs) 文本引导图像生成模型的演变(DALLE/CLIP/GLIDE) 作者对迄今为止所有的…

YOLOv7--复现并训练自己的数据集(简单)

目录 1、官网下载代码 2、上传代码至服务器 3、配置环境 4、上传数据集 5、新建yaml文件 6、修改Yolov7.yaml文件 7、修改train.py文件 8、开始训练 9、复现Yolov7遇到的错误&#xff1a; 1、官网下载代码 Yolov7代码下载网址&#xff1a; https://github.com/WongKi…

【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…