You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postman发送GET请求时参数中+号被转为空格的问题排查

问题复现
  • 基于Spring Boot开发了GET接口,通过@RequestParam接收字符串类型的expression参数,核心接口代码为:
@GetMapping(value = "/validate")
private void validateExpression(@RequestParam(value = "expression") String expression) {
    System.out.println(expression);
    // 输入字符串校验逻辑
}
  • 第一类测试请求:参数值包含斜杠
    请求地址:https://localhost:8443/validate?expression=Y07607=Curr_month:Y07606/Curr_month:Y07608

    控制台输出:Y07607=Curr_month:Y07606/Curr_month:Y07608 合法,校验逻辑正常识别为合法输入

  • 第二类测试请求:参数值包含+号
    请求地址:https://localhost:8443/validate?expression=Y07607=Curr_month:Y07606+Curr_month:Y07608

    控制台输出:Y07607=Curr_month:Y07606 Curr_month:Y07608 非法,原本的+号被替换为空格,导致校验逻辑判定为非法输入

问题根因

这个现象不是框架bug,是完全符合标准编码协议的正常行为:
在GET请求查询参数的默认编码规则(application/x-www-form-urlencoded)中,+被约定为空格的转义表示。也就是说服务端在解析URL查询参数时,会按照协议规范,自动把参数值里的+转换为空格,再赋值给对应的请求变量。
如果需要在参数值中传递字面意义的+字符,必须按照URL编码规范将其转义为对应的百分号编码%2B,服务端解析时才会将其识别为普通的+字符,而非空格。

可落地的解决方法
  • 手动拼请求地址时,对参数值做完整的URL编码:把需要传递的+字符替换为%2B,调整后的请求地址为https://localhost:8443/validate?expression=Y07607=Curr_month:Y07606%2BCurr_month:Y07608,此时服务端解析得到的参数值会保留完整的+字符,不会被转换为空格。
  • 使用接口测试工具发请求时,不要手动在地址栏拼接参数,切换到工具自带的Params配置页填写参数的key和value,工具会自动完成合规的URL编码,避免手动编码遗漏的问题。
  • 不推荐为了兼容未转义的+号修改服务端的默认参数解析规则:这种做法会打破通用的URL编码协议,容易引入其他特殊字符的解析冲突,长期维护成本极高。
  • 额外注意:所有在URL中有特殊含义的字符(包括/、?、=、#、实际空格等),如果要作为普通参数值传递,都需要做对应的百分号编码,否则都会出现非预期的解析结果。

内容的提问来源于stack exchange,提问作者Bhumika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 14:06:04