Spring Boot API 的 x-www-form-urlencoded 提交

在使用 Sprint Boot 提交 x-www-form-urlencoded 的时候,我们首先需要知道 x-www-form-urlencoded 这个是什么东西。

application/x-www-form-urlencoded

这应该是最常见的 POST 提交数据的方式了。浏览器的原生 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。

就是浏览器将会将表单中的内容转换为 URL 的方式提交到后台进行处理。转换的方式其实就是使用 K=V 对的方式。

不同的 K=V 之间是用 & 进行分隔。

例如下面的示例:

POST /test HTTP/1.1
Host: foo.example
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

field1=value1&field2=value2

你可以在你的 API 后面直接加上上面的字符串,然后 POST 请求过去,在上面的字符串和 URL 之间需要添加一个 ? 号。

转换流程是:

假设你有一个表单,在表单中获取的值为:

field1=value1
field2=value2

你需要提交的 URL 为 api.example.com/re/request 这样的话。

如果你使用了 application/x-www-form-urlencoded 提交的话,浏览器首先将表单中的数据转换为:field1=value1&field2=value2,请注意中间是使用 & 分隔的。

然后提交到地址:api.example.com/re/request?field1=value1&field2=value2,上面显示的是完整的 URL。

这种提交方式是表单的默认提交方式,同时提交的字符将会进行编码,如果你提交中文字符的话,你可能会看到 %UER,这样的表达,这是因为对中文字符进行了编码而已。

POSTMAN 设置

在使用这种提交之前,你可以在 POSTMAN 设置。

 

application-01

 

需要在 POSTMAN 中选择提交方式,并且在下面的参数部分设置需要的参数然后单击发送提交即可。

Spring Boot Controller

在 Spring Boot Controller 中需要设置使用 MultiValueMap。

在查看源代码后,你会知道 MultiValueMap 是扩展 Map 的接口,然后用于存储多值的。

 

application-02

 

一个 Controller 的代码如下:

    @PostMapping("/soldm")
    public ResponseEntity<?> searchUsers(@RequestBody MultiValueMap< String, String > values) {

        logger.debug("K=V Map - {}" , values);

        REListing reListing=  listingService.getREListingById();

        return new ResponseEntity<REListing>(reListing, HttpStatus.OK);
    }

在 RequestBody 设置 MultiValueMap 后,你就可以获得 POST 提交的数据了。

 

application-03

 

测试运行

测试运行后查看日志:

2021-01-27 10:52:38.782 DEBUG 25176 --- [nio-8080-exec-4] c.o.e.s.controller.RealEstateController  : K=V Map - {field1=[value1], field2=[value1]}

 

application-04

 

从这里,你可以 debug 上传的数据和 MAP 中是否设置了正确的参数。

 

https://www.ossez.com/t/spring-boot-api-x-www-form-urlencoded/13225

### 如何在后端接收和解析 `x-www-form-urlencoded` 请求参数 #### 后端接收 `x-www-form-urlencoded` 参数的关键点 当客户端通过 Postman 或其他工具发送 `Content-Type: application/x-www-form-urlencoded` 的请求时,后端需要正确配置来接收这些参数。如果后端无法接收到参数,可能是因为控制器方法未正确定义或缺少必要的注解。 对于 Spring Boot 应用程序而言,在 Controller 层可以使用 `@RequestParam` 注解来绑定 URL 编码形式的键值对到方法参数上[^1]。然而,为了确保能够成功接收并解析该类型的参数,还需要注意以下几个方面: - **Controller 方法定义** 使用 `@RequestParam` 是一种常见的方式用于获取单个查询字符串或者表单提交中的字段值。例如: ```java @PostMapping(value = "/example", consumes = "application/x-www-form-urlencoded") public String handleForm(@RequestParam("username") String username, @RequestParam("password") String password) { return "Username is " + username + ", Password is " + password; } ``` - **消费媒体类型声明** 显式指定 `consumes="application/x-www-form-urlencoded"` 可帮助框架理解传入的内容格式,并自动完成相应的反序列化操作[^2]。 - **全局配置支持** 默认情况下,Spring MVC 已经内置了对这种 MIME 类型的支持,因此一般无需额外调整。但如果遇到问题,则需确认项目中是否存在自定义消息转换器覆盖默认行为的情况。 #### 示例代码展示 下面给出一段完整的 Java (基于 Spring Boot) 实现例子,演示如何设置好环境从而顺利接受来自前端带有此头部信息的数据包: ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api") public class ExampleController { @PostMapping(path="/submit", consumes={"application/x-www-form-urlencoded"}) public ResponseEntity<String> submitData( @RequestParam(required=true) String name, @RequestParam(defaultValue="World") String greeting){ return new ResponseEntity<>("Hello "+greeting+", your name is "+name+".", HttpStatus.OK); } } ``` 上述片段里展示了两个重要部分:一是路径映射加上特定消耗属性;二是利用 RequestParam 提取具体项作为函数形参输入源之一. #### 注意事项 尽管大多数现代 Web 开发倾向于采用 JSON 数据交换标准,但在某些场景下仍然会碰到传统 HTML 表单风格的应用需求——即所谓的 “URL encoded form data”。此时就需要按照前述指导原则妥善安排服务器侧逻辑结构以便兼容此类交互模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HoneyMoose

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值