如何向XMLHttpRequest的GET请求中添加JSON数据?
问题原因分析
- HTTP标准中GET请求的语义为获取资源,没有对请求体的语义做定义,绝大多数后端框架默认不会解析GET请求的请求体,因此你第一种直接在GET请求中send JSON的写法,后端自然无法通过
req.json拿到数据。 - 你第二种把JSON序列化后拼到查询字符串的写法,数据是存放在URL的查询参数里的,
req.json只会解析请求体中的JSON内容,自然返回null,你只能通过查询参数相关的API拿到数据。 - Postman可以正常拿到是因为Postman工具本身不限制GET请求携带请求体,且你的后端应该做了GET请求体解析的特殊配置,但这种方式兼容性极差,绝大多数浏览器、代理服务器、CDN都会直接丢弃GET请求的请求体,不建议生产环境使用。
- 之前jQuery的
ajax方法可以正常使用,大概率是你之前的jQuery代码在GET请求下传参时,jQuery自动将参数序列化为查询字符串拼接到了URL上,后端当时是从查询参数中获取数据,并非是从请求体的JSON中解析,和你现在的第二种写法本质一致。
解决方案
方案1:继续使用GET请求
保留第二种拼接查询字符串的写法,后端调整获取逻辑,从查询参数中取出对应字段后自行反序列化JSON即可,以Node.js Express框架为例:
const jsonData = JSON.parse(req.query.data)
方案2(更推荐):改为POST请求
遵循HTTP语义,将请求方法改为POST,补充JSON类型的请求头,后端req.json即可正常解析到请求体中的JSON数据:
xhr.open("POST", "http://localhost/test", true); xhr.setRequestHeader('Content-Type', 'application/json'); body = JSON.stringify({"email": "hey@mail.com", "password": "101010"}); xhr.send(body);
内容的提问来源于stack exchange,提问作者Wusiki Jeronii
相关产品推荐
相关产品推荐

