Postman无法原生校验JSON Schema可选字段,需用Pre-request Script动态构造请求体以控制字段存在性;通过判断环境变量是否为空来决定是否包含该字段,避免{{phone}}留空导致JSON解析错误或语义不符。

Postman 本身不支持“JSON Schema 级别的可选字段校验”,但你可以通过参数化 + 条件性构造 JSON 请求体来模拟和测试可选字段行为。 关键不是让 Postman “识别”哪些字段可选,而是控制哪些字段实际出现在请求中。
怎么用 {{variable}} 动态控制 JSON 字段存在与否
Postman 的 raw JSON 模式不支持 if/else 语法,但可以通过预请求脚本(Pre-request Script)动态拼接请求体,实现字段的有条件注入。
- 在
Body → raw → JSON中不要直接写死字段,而是留空或占位,例如:{"username":"{{username}}","email":"{{email}}","phone":"{{phone}}"} - 在
Pre-request Script中判断变量是否为空,只设置非空变量:if (pm.environment.get("phone")) { pm.request.body.raw = JSON.stringify({ username: pm.environment.get("username"), email: pm.environment.get("email"), phone: pm.environment.get("phone") }); } else { pm.request.body.raw = JSON.stringify({ username: pm.environment.get("username"), email: pm.environment.get("email") }); } - 这样,当
phone环境变量未设置或为空时,该字段就不会出现在最终发送的 JSON 中 - 注意:必须关闭自动添加的
Content-Type头(或确保它仍是application/json),否则可能因手动覆盖 body 导致头体不一致
为什么不能直接在 raw JSON 里用 {{phone}} 然后留空?
因为 JSON 语法不允许键存在但值为 undefined 或空字符串(除非你显式写成 "phone": "" —— 这是“字段存在且值为空”,不是“字段不存在”)。
- 如果环境变量
phone未定义,{{phone}}渲染结果是字面量{{phone}},导致 JSON 解析失败,报错SyntaxError: Unexpected token { - 如果设为
""(空字符串),字段仍存在,后端收到的是{"phone":""},这与“不传该字段”的语义不同,可能触发默认值逻辑或校验失败 - 所以,靠模板替换无法安全实现“字段级可选”,必须用脚本控制整个对象结构
用 Runner 配合 CSV/JSON 数据文件批量测可选字段组合
当你需要系统性验证“只传 username”、“传 username+email”、“全字段”等多组场景时,Runner 是更可靠的方式。
- 准备 CSV 文件(注意:空列代表该字段不参与本次请求):
username,email,phone alice,alice@example.com, bob,bob@example.com,13800138000 carol,,13900139000
- 在 Pre-request Script 中读取当前行数据,并仅将非空列构造成 JSON 对象(同上一节逻辑)
- 运行 Runner 时选择该文件,每行生成一次请求,字段组合由数据驱动,避免手写多条重复请求
- 配套的 Tests 脚本可验证响应是否接受缺失字段(例如断言
pm.response.json().code === 200),而非只看状态码
真正容易被忽略的是:后端对“字段缺失”和“字段为 null/空字符串”的处理往往完全不同。测试可选字段,本质是测试后端契约——你得明确知道文档里写的“可选”究竟指“允许不传”,还是“允许传 null”。Postman 只负责把你要的字节发出去,别让它替你猜语义。











