如何在我们的SpringBoot上配置我们的表单请求PUT、DELETE

本文介绍了在SpringBoot中如何简单快捷地启用RESTful风格的PUT和DELETE请求,只需在配置文件中开启一项设置,并在表单中添加隐藏字段指定请求类型。通过示例代码展示了前后端交互的实现方式,使得在不使用过滤器的情况下也能处理PUT和DELETE操作。

直接上干货:
我们知道在我们之前的Spring 中若 想要开启我们的REST风格,使用表单PUT和DELETE请求,我们就必须配置过滤,很是麻烦。
但是我们在SpringBoot中如果想要开启,只需要在我们yaml或者properties配置文件中开启:

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

即可开启我们SpringBoot请求
紧接着我们在我们的表单中需要添加一个隐藏域来表示我们的请求方式,其中name必须为_method,(我们也可以后期修改)而value即为我们想要的操作
修改name的默认值
在这里插入图片描述

我们默认在SpringBoot中是不开启的,因为我们通常在开发中只有用到表单的时候才会需要开启。因为表单中是没有POST和DELETE请求。所以就需要开启。
例如:
(代码实现)

前端代码:


<form action="/user" method="get">
    <input value="REST-GET 提交" type="submit">
</form>

<form action="/user" method="post">
    <input value="REST-POST 提交" type="submit">
</form>

<form action="/user" method="post">
    <input name="_method" type="hidden" value="delete">
    <input value="REST-DELETE 提交" type="submit">
</form>

<form action="/user" method="post">method必须为POST,才可以被SpringBoot识别
    <input name="_method" value="put" type="hidden">
    <input value="REST-PUT 提交" type="submit">
</form>

后端:


@RestController
public class helloController {
    @RequestMapping("scenery.jpg")
    public String test01(){
        return "tupian";
    }

    @GetMapping("/user")
    //我们可以使用注解XXXMapping(“value”)来代替我们的@RequestMapping(value= “XX”,method = RequestMethod.XXX)
    public String test02(){

        return "GET_ebdbbd";
    }

    @PostMapping("/user")
    public String test03(){
        return "POST_ebdbbd";
    }


    @RequestMapping(value = "/user",method = RequestMethod.DELETE)
    public String test04(){

        return "DELETE_ebdbbd";
    }

    @RequestMapping(value = "/user",method = RequestMethod.PUT)
    public String test05(){

        return "PUT_ebdbbd";
    }
}

yml配置文件:

spring:
                       mvc:
                         hiddenmethod:
                           filter:
                             enabled: true

而在开发中,我们通常是与我们前端进行分离的,前端给我们一个接口,我们只需要给前端返回一个JSON数据即可。

REST原理的实现:
在这里插入图片描述

<think>嗯,用户现在想了解在HTTP请求中,GET、POSTPUTDELETE这些方法使用什么样的参数绑定方式,特别是涉及Content-Type为application/x-www-form-urlencoded的情况。之前的对话里,用户遇到了Content-Type不支持的错误,可能现在想更全面地了解不同HTTP方法如何处理参数。首先,我需要回忆一下不同HTTP方法的用途和参数传递方式。GET通常用于获取数据,参数在URL查询字符串中,而POSTPUTDELETE通常将参数放在请求体中,但具体还要看Content-Type。用户特别提到application/x-www-form-urlencoded,这个格式通常用于表单提交,数据编码成键值对。接下来,根据之前的引用内容,@RequestParam用于处理application/x-www-form-urlencoded编码的内容,而@RequestBody用于处理像JSON这样的格式。用户可能想知道在不同的HTTP方法中,SpringMVC如何绑定这些参数,是否需要不同的注解或处理方式。需要分方法来看。对于GET请求,参数总是在URL中,所以使用@RequestParam或者直接绑定到对象。POSTPUTDELETE如果使用表单格式,应该用@RequestParam或者对象绑定,而如果传JSON,则用@RequestBody。用户可能混淆了不同方法之间的处理方式,导致之前的错误。另外,用户提到PUTDELETE方法,这些方法有时可能携带请求体,但有些客户端或框架可能不支持,需要确认SpringMVC的处理机制。例如,PUT方法的表单数据是否也能用@RequestParam来接收。还要考虑RESTfulAPI设计中的常见实践,比如PUT用于更新资源,通常可能同时使用路径变量和请求体参数,这时候参数绑定可能需要组合使用@PathVariable和@RequestParam或@RequestBody。可能需要提醒用户注意,虽然理论上PUTDELETE可以有请求体,但在实际使用中,某些浏览器或客户端可能限制这些方法的请求体,导致数据无法正确传递,因此需要确保客户端正确设置Content-Type和请求体内容。另外,要确保在SpringBoot中正确配置了消息转换器,以处理不同Content-Type的请求,尤其是当同时支持表单和JSON时,需要添加相应的转换器,比如MappingJackson2HttpMessageConverter和FormHttpMessageConverter。最后,需要总结不同HTTP方法在Spring中的参数绑定方式,并强调Content-Type的重要性,避免用户混淆@RequestParam和@RequestBody的使用场景,从而避免出现之前的错误。</think>### HTTP方法参数绑定方式详解(基于`application/x-www-form-urlencoded`) #### 一、参数绑定与HTTP方法的关系 在Spring MVC中,参数绑定方式与**HTTP方法类型**和**Content-Type**密切相关。以下是四种常见HTTP方法的绑定规则: | HTTP方法 | 参数位置 | 适用注解/方式 | 典型Content-Type | |----------|-------------------|---------------------------|----------------------------------| | GET | URL查询字符串 | `@RequestParam`/自动绑定 | 无(默认`x-www-form-urlencoded`)| | POST | 请求体/URL查询字符串| `@RequestParam`/自动绑定 | `x-www-form-urlencoded` | | PUT | 请求体/URL查询字符串| `@RequestParam`/自动绑定 | `x-www-form-urlencoded` | | DELETE | URL查询字符串 | `@RequestParam`/自动绑定 | 无(通常不带请求体) | #### 二、具体场景实现 ##### 1. GET请求(查询参数) ```java // 方式1:使用@RequestParam @GetMapping("/user") public User getUser(@RequestParam String userId) { /*...*/ } // 方式2:自动绑定到对象(推荐) @GetMapping("/user") public User getUser(UserQuery query) { /*...*/ } // 调用示例:GET /user?userId=123&name=test ``` ##### 2. POST请求表单提交) ```java // 正确方式:参数绑定(不使用@RequestBody) @PostMapping("/create") public void createUser(@RequestParam String name, @RequestParam int age) { /*...*/ } // 或自动绑定到对象 @PostMapping("/create") public void createUser(UserForm form) { /*...*/ } ``` 请求示例: ```http POST /create HTTP/1.1 Content-Type: application/x-www-form-urlencoded name=John&age=30 ``` ##### 3. PUT请求(更新操作) ```java @PutMapping("/update") public void updateUser( @RequestParam String userId, // URL参数 @RequestParam String newName // 请求体参数 ) { /*...*/ } ``` 请求示例: ```http PUT /update?userId=123 HTTP/1.1 Content-Type: application/x-www-form-urlencoded newName=John+Smith ``` ##### 4. DELETE请求(删除操作) ```java // 参数通常只出现在URL中 @DeleteMapping("/delete") public void deleteUser(@RequestParam String userId) { /*...*/ } ``` 请求示例: ```http DELETE /delete?userId=123 HTTP/1.1 ``` #### 三、核心注意事项 1. **`@RequestBody`的禁用场景** 当使用`x-www-form-urlencoded`时,**禁止**使用`@RequestBody`注解,该注解仅适用于`application/json`等结构化数据格式[^1] 2. **混合参数处理** URL参数与请求体参数可以混合使用: ```java @PostMapping("/hybrid") public void hybridMethod( @RequestParam String fromUrl, // 来自URL @RequestParam String fromBody // 来自请求体 ) { /*...*/ } ``` 3. **PUT/DELETE请求体限制** 虽然HTTP规范允许PUT/DELETE携带请求体,但某些浏览器/客户端可能不支持,建议优先使用URL参数[^2] #### 四、Content-Type处理机制 当请求头包含`Content-Type: application/x-www-form-urlencoded`时,Spring会: 1. 解析请求体为`key=value&key2=value2`格式 2. 自动调用`FormHttpMessageConverter` 3. 将参数映射到方法的`@RequestParam`参数或绑定对象属性 $$ \text{参数解析流程} = \begin{cases} \text{URL参数} \rightarrow \text{QueryString解析} \\ \text{请求体参数} \rightarrow \text{FormHttpMessageConverter解析} \end{cases} $$ #### 五、常见错误解决方案 ```java // 错误:对表单数据使用@RequestBody @PostMapping("/error-demo") public void errorDemo(@RequestBody FormData data) { /*...*/ } // 会抛出415错误 // 修正:移除@RequestBody @PostMapping("/correct-demo") public void correctDemo(FormData data) { /*...*/ } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值