在 HTTP POST 请求中,服务器底层收到的请求体(body)始终是字节流(bytes)或字符串(string),即使客户端发送的是 JSON 数据,也不会直接收到一个"JSON 对象"。
为什么是字符串?
- HTTP 协议传输的数据是纯文本或二进制流。
- 当客户端发送 JSON 时,通常会:
- 将 JavaScript 对象序列化为 JSON 字符串 (例如使用
JSON.stringify())。 - 设置请求头
Content-Type: application/json。 - 将这个 JSON 字符串放入请求体中发送。
- 将 JavaScript 对象序列化为 JSON 字符串 (例如使用
- 服务器收到后,请求体就是一个 JSON 格式的字符串 (如
{"name": "test", "age": 30})。
服务器如何处理成 JSON 对象?
大多数现代 Web 框架会根据 Content-Type 自动解析:
- Node.js + Express :使用
express.json()中间件(或旧版的 body-parser)后,req.body会直接是解析后的对象 (如{ name: 'test', age: 30 })。 - Python + Flask :使用
request.get_json()或request.json,如果 Content-Type 是 application/json,会返回解析后的字典对象 ;否则可以用request.data获取原始字符串/字节。 - Java/Spring、PHP 等:类似,有内置或中间件自动解析成对象/Map。
如果没有正确设置 Content-Type: application/json,或框架没有启用解析中间件,服务器就只能拿到原始字符串,需要手动用 JSON.parse()(JS)或对应库解析。
总结
- 原始收到:一定是字符串(或字节)。
- 框架处理后:通常直接可用为 JSON 对象(更方便开发)。
- 如果你自己写底层服务器(如纯 Node.js http 模块),就需要手动读取流并解析字符串。
如果你在具体框架中遇到问题(如收不到对象),检查请求头的 Content-Type 和框架的 body 解析配置即可。