Spring Boot POST接口接收表单编码请求时字符串末尾多出=符号问题
问题产生原因
接口声明消费的媒体类型是application/x-www-form-urlencoded,这是标准的表单提交格式,数据结构固定为键=值的键值对形式,多组参数用&分隔。
Spring处理这种格式的请求时,会自动调用FormHttpMessageConverter对请求体做解析:当传入的请求内容是不带=的1时,转换器会默认将这段内容识别为参数名,对应的参数值为空字符串,后续将解析结果序列化为字符串返回时,会自动按照表单格式拼接=分隔键和值,最终返回1=的结果,这是组件的标准处理逻辑,不是框架bug。
修复方案
根据实际业务场景二选一即可:
- 场景1:接口本意是接收纯文本内容,不需要表单格式
- 将接口的
consumes属性修改为MediaType.TEXT_PLAIN_VALUE,明确接口接收纯文本类型的请求体 - 修正后的代码示例:
- 将接口的
@RestController
public class MyApi{
@PostMapping(path = "/", consumes = {MediaType.TEXT_PLAIN_VALUE})
public String parseInput(@RequestBody String data) {
return data;
}
}
3. 调用时可以明确指定请求头避免被误识别为表单:`curl -H "Content-Type: text/plain" -d "1" http://localhost:1337/`,此时接口会正常返回`1`。 - 场景2:接口确实需要接收`application/x-www-form-urlencoded`格式的表单请求 不要直接用`@RequestBody String`接收整个请求体,改用`@RequestParam`注解绑定对应参数即可。如果需要获取原始的表单请求字符串,可以自定义请求包装器提前缓存原始请求流,绕开表单转换器的默认解析逻辑,这类非标准操作无特殊需求不推荐使用。 内容的提问来源于stack exchange,提问作者Anthony Vinay
相关产品推荐
相关产品推荐

