Postman Body选错类型会导致服务端无法解析JSON:必须选raw模式并设为JSON格式,同时确保Content-Type为application/json;否则服务端将按表单或multipart处理,造成读取为空或乱码。

Postman 里 Body 选错类型导致服务端读不到 JSON
Postman 的 Body 有多种模式:raw、form-data、x-www-form-urlencoded、binary 等。如果选了 form-data 或 x-www-form-urlencoded,却在里面填了 JSON 字符串(比如 {"name":"alice"}),服务端根本不会按 JSON 解析——它会当成表单键值对或 multipart 数据处理,结果就是 r.Body 读出来是空或乱码。
必须确认两点:
- Body 模式选的是
raw - 右上角下拉菜单明确选了
JSON(不是 Text 或 JavaScript) - Content-Type 请求头自动设为
application/json(若手动改过,需检查是否拼写错误,如applicaiton/json)
Go 服务端反复读取或直接打印 r.Body 导致数据丢失
r.Body 是一个 io.ReadCloser,只能读一次。常见错误是:先用 json.NewDecoder(r.Body).Decode(&v) 解析,再试图用 io.ReadAll(r.Body) 打印原始内容——第二次读时流已耗尽,返回空字节切片或 panic。
调试时正确做法是:
- 用
bodyBytes, _ := io.ReadAll(r.Body)一次性读完并缓存 - 再用
bytes.NewReader(bodyBytes)构造新 reader 给json.NewDecoder用 - 或直接用
json.Unmarshal(bodyBytes, &v),避免流操作 - 别在解析前后都调用
r.Body.Close(),只在最后 close 一次
JSON 字符串含非法字符(尤其是中文引号、BOM、不可见空格)
Go 的 encoding/json 包严格遵循 RFC 8259,只接受 ASCII 双引号 "(U+0022),拒绝中文全角引号 “”(U+201C/U+201D)、不间断空格(U+00A0)、BOM 头等。这类字符肉眼难辨,但会导致 json.Unmarshal 立即返回 invalid character '' looking for beginning of object key string 类错误。
排查建议:
- 把 Postman 中的 JSON 复制到 VS Code 或 Sublime,开启显示不可见字符(如设置
"editor.renderWhitespace": "all") - 用在线工具(如 jsonlint.com)粘贴验证,看是否报语法错误
- 服务端加一行日志:
bodyBytes, _ := io.ReadAll(r.Body); log.Printf("raw body: %q", bodyBytes),观察输出中是否有\u201c或\xa0 - 避免从 Word、微信、网页直接复制 JSON,一律手敲或用代码生成
后端框架未启用 JSON 解析器(如 Gin、Echo、Yii2)
很多 Web 框架默认只解析 application/x-www-form-urlencoded 和 multipart/form-data,对 application/json 请求体不自动解包。例如:
- Gin 需要显式注册:
router.Use(gin.Recovery(), gin.Logger())不够,得加gin.Default()或手动配置gin.New().Use(gin.Recovery()).Use(gin.Logger()),并确保没禁用 JSON 绑定 - Yii2 必须在 config/web.php 中为
request组件添加'parsers' => ['application/json' => 'yii\web\JsonParser'] - 自定义 HTTP handler 若没调用
json.NewDecoder(r.Body).Decode(),就永远拿不到结构化数据
最易被忽略的是:你以为框架“应该能自动处理”,结果它根本没碰那块数据。检查框架文档里关于 Content-Type 支持的说明,而不是依赖直觉。


















