URL中#是fragment标识符,浏览器和Postman不会将其发送至服务器,导致参数丢失;必须用encodeURIComponent编码为%23,或改用Body传参(如x-www-form-urlencoded)避免该问题。

Postman 里 # 号参数直接拼在 URL 后会失效
URL 中的 # 是 fragment 标识符,浏览器和 HTTP 客户端(包括 Postman)默认不会把它发给服务器。你看到参数“丢了”,不是 Postman 没传,而是它根本没进请求链路——服务端压根收不到。
常见错误现象:https://api.example.com/search?q=hello#world,后端 q 只收到 hello,#world 消失;或者后端日志里完全没捕获到该段内容。
- 别把带
#的值塞进 Params 标签页——Postman 会自动拼成 URL fragment,不发出去 - 也别手动写在 URL 输入框末尾,一样被截断
- 如果接口文档明确要求参数含
#(比如某些老系统用它分隔子字段),那必须编码
必须用 encodeURIComponent 编码 # 才能当参数传
# 对应的 URL 编码是 %23,但不能手敲替换,得用标准编码函数,否则遇到中文、emoji、其他符号时会出错。
正确做法是在 Pre-request Script 里动态处理:
const rawValue = "abc#def";
const encodedValue = encodeURIComponent(rawValue);
pm.request.url.query.remove("tag");
pm.request.url.query.add("tag", encodedValue);
这样最终发出的 URL 是 ?tag=abc%23def,服务端用标准解码(如 Java 的 URLDecoder.decode()、Node.js 的 decodeURIComponent())就能还原。
- 不要用
encodeURI():它不编码#、?、/等,只适合整个 URI,不适合单个参数值 - 如果参数来自环境变量或全局变量,同样要套一层
encodeURIComponent() - Postman 控制台右上角的 “EncodeURIComponent” 快捷按钮只能用于手动临时编码,没法自动化
更稳妥的方案:换传参方式,彻底绕过 URL 编码问题
只要不是 GET 请求强制要求参数在 URL 上,就优先改用 Body 传参。尤其是 form-data 或 x-www-form-urlencoded,它们走请求体,不经过 URL 解析阶段,#、+、/ 全部原样送达。
Postman Mac版是一款专为macOS设计的API开发与测试工具,凭借简洁的界面和强大的功能,深受开发者喜爱。它支持发送各种HTTP请求(GET、POST、PUT等),轻松管理接口集合、环境变量和模拟服务器。Mac用户可享受原生性能、快捷键优化及与系统无缝集成的体验,适用于接口调试、自动化测试和文档生成。无论是个人项目还是团队协作,Postman for Mac都能提升API开发效率,是ma
操作路径:切换 Body 标签 → 选 x-www-form-urlencoded → 填键值对(如 tag → abc#def)→ 发送。
- 服务端需对应读取表单数据(如 Spring Boot 用
@RequestParam,Express 用req.body) - GET 请求无法用 Body,只能硬编码;POST/PUT/PATCH 都推荐这个方式
- 注意
Content-Type头会自动设为application/x-www-form-urlencoded,不用手填
调试时怎么确认 # 真的发出去了?
别只看 Postman 界面右上角显示的 URL——那个是“渲染后”的,已经把 fragment 剥离了。要看真实发出的请求:
打开 Postman 的 Console(View → Show Postman Console),发一次请求,点开日志里的请求条目,在 Request URL 字段里找。如果看到 %23,说明编码成功;如果看到裸 #,说明没编码或被当成 fragment 处理了。
另外,服务端日志是最准的验证:打印原始 query string 或 raw body,比任何客户端界面都可靠。
真正容易被忽略的是 fragment 和 query 的边界——Postman 不报错,也不警告,它只是安静地吞掉 # 及之后所有内容。你得主动去 Console 里翻原始请求,而不是信界面上显示的 URL。










