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
相关产品推荐
相关产品推荐

