• 表单提交RESTful风格——GET,POST,DELETE,PUT 4种方式处理源码


    表单提交RESTful风格——GET,POST,DELETE,PUT 4种方式处理源码

    在REST中,资源师通过URI来指定的,对资源的增删改查操作可以通过HTTP协议提供的GET\POST\PUT\DELETE等方法实现。

    表单的请求只能是GET或者POST,而REST中的DELETE和PUT请求需要开启配置后再设置隐藏请求方式才能达到目的,我们在后续的学习工作中很少用到这种方式,后边大多是前后端分离项目,客户端发出的请求可以直接通过DELETE或者PUT去请求。

    1. RESTful手动开启配置生效——application.properties

    开启配置后,表单提交POST中含隐藏方法的会被拦截,拦截后读取POST提交表单中隐藏方法_method的值,不开启配置会直接按照POST请求处理。

    spring.mvc.hiddenmethod.filter.enabled=true
    
    • 1

    在这里插入图片描述

    2. 表单提交REST原理:

    1. 表单提交会带上_method=PUT
    2. 请求过来被HiddenHttpMethodFilter拦截。
    3. POST请求,并且请求是正常。
    4. 获取到_method的值。
    5. 兼容以下请求;PUT、DELETE、PATCH
    6. 原生request (post),包装模式requesWrapper重写了getMethod方法,返回的是传入的值,
    7. 过滤器链放行的时候用wrapper。以后的方法调用getMethod是调用requesWrapper的_method值。

    3. REST使用客户端工具:

    • 如PostMan直接发送Put、delete等方式请求,无需Filter。所以也无需开启配置。

    4. 源码查看小技巧

    4.1 CTRL+H——类的层次结构

    在选中所需要查看层次结构类的前提下,按快捷键: CTRL+H,可以进行查看。
    在这里插入图片描述

    4.2 CTRL+ALT+U——类的继承和实现关系图

    在选中所需要查看层次结构类的前提下,按快捷键: CTRL+ALT+UCTRL+ALT+SHIFT+U,可以进行查看继承类和实现接口的关系图。

    在这里插入图片描述

    5. 测试

    创建一个SpringBoot项目,用表单和PostMan两种方式去请求接口测试

    1. 引入相关依赖——pom.xml
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.7.3version>
            <relativePath/> 
        parent>
        <groupId>com.examplegroupId>
        <artifactId>springboot-RESTartifactId>
        <version>0.0.1-SNAPSHOTversion>
        <properties>
            <java.version>1.8java.version>
        properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
        dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    1. 核心配置 ——application.properties
    spring.mvc.hiddenmethod.filter.enabled=true
    
    • 1
    1. 控制层——UserController.java
    package com.guo.springboot.controller;
    import org.springframework.web.bind.annotation.*;
    import javax.servlet.http.HttpServletRequest;
    @RestController
    public class UserController {
        @GetMapping("/user")
        public String getUser(HttpServletRequest request){
            String username = request.getParameter("username");
            return "1"+username;
        }
        @PostMapping("/user")
        public String postUser(String username){
            return "2"+username;
        }
        @DeleteMapping("/user")
        public String deleteUser(String username){
            return "3"+username;
        }
        @PutMapping("/user")
        public String putUser(String username){
            return "4"+ username;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    1. 创建首页index.html
      首页默认放在resources→static下
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>indextitle>
    head>
    <body>
    <h1>测试表单提交REST的四种请求h1>
    <form action="/user" method="get">
        <input name="username" value="REST-GET" type="submit">
    form>
    <form action="/user" method="post">
        <input name="username" value="REST-POST" type="submit">
    form>
    <form action="/user" method="post">
        <input type="hidden" name="_method" value="delete" >
        <input name="username" value="REST-DELETE" type="submit">
    form>
    <form action="/user" method="post">
        <input type="hidden" name="_method" value="put" >
        <input name="username" value="REST-PUT" type="submit">
    form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    1. 启动程序
      在这里插入图片描述

    5.1 表单提交REST测试

    RESTful手动开启配置

    spring.mvc.hiddenmethod.filter.enabled=true
    
    • 1

    首页:http://localhost:8080/

    在这里插入图片描述
    1.点击第一个GET提交表单
    在这里插入图片描述
    2.点击第二个POST提交表单
    在这里插入图片描述

    3.点击第三个DELETE提交表单
    在这里插入图片描述

    4.点击第四个PUT提交表单
    在这里插入图片描述

    在这里插入图片描述

    5.2 客户端PostMan测试

    RESTful手动关闭配置(默认就是关闭的,这里可以直接删除这条配置),这里的开启和关闭只会影响表单的提交DELETE和PUT请求,这两种请求是放在POST请求表单中的隐藏方法中,开启配置的时候请求拦截POST请求,读取隐藏的方法,把隐藏的方法替代POST请求,进而达到“偷梁换柱”的目的;
    而关闭配置就默认按照POST请求发起请求。

    spring.mvc.hiddenmethod.filter.enabled=false
    
    • 1

    关闭后POST表单中的隐藏DELETE和PUT请求直接走POST请求 2 了在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    java中compareTo比较两个日期大小
    关于 Git 的一些常识和我的一些零言碎语
    redis-shake同步数据
    Python学习基础笔记七——元组
    ES6 - 扩展运算符与Object.assign对象拷贝与合并
    计网课设-发送TCP数据包
    C++STL【string】下模拟实现string
    网络爬虫技术及应用
    SpringBoot:ch03 yml 数据绑定示例
    高质量 Spring 实战学习笔记,腾讯内部学习 Spring 首推
  • 原文地址:https://blog.csdn.net/qq_45896330/article/details/126931024