qs.stringify() 和JSON.stringify()的区别
https://www.cnblogs.com/dujishi/p/8859207.html
var a = {name:'LIHAO',age:10};
qs.stringify(a) // 'name=LIHAO&age=10'
JSON.stringify(a) // '{"name":"LIHAO","age":10}'
var a = '{name:"LIHAO",age:10}';
qs.parse(a) //{ '{name:"LIHAO",age:10}': '' }
JSON.parse(a) //{ name: 'LIHAO', age: '10' }
var a=[{a:123},{a:345}]
qs.stringify(a) //'0[a]=123&1[a]=345'
后端是@RequestBody 用 content-type = application/json
后端是@RequestParam 用 content-type = application/x-www-form-urlencoded
我vue中使用了JSON.stringify(a)后,出现了POST http://localhost:8081/xxx/register 415 (Unsupported Media Type)的报错。
在查找资料后,找到:“415错误的解释是说,服务器无法处理请求附带的媒体格式,不明白什么意思,一开始以为是后台设置没办法解析,后来用postman、swagger请求,都可以成功,确定是我请求的问题,查看了HTTP请求头部文件,发现content-type跟我们的json格式不同”
Accept代表发送端(客户端)希望接受的数据类型。
比如:Accept:text/xml(application/json),
代表客户端希望接受的数据类型是xml(json )类型
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。
比如:Content-Type:text/html(application/json) ,
代表发送端发送的数据格式是html(json)。
我的解决办法是在main.js中增加:
axios.defaults.headers.post['Content-Type'] = 'application/json';
(我配置了全局的请求头Content-Type=application/json之后,把后端接受参数全改成application/json)
------------------------------------------
后面我使用get方法时又出现了问题,报错required request body is missing。
1.网上查阅资料得知:
Get和delete:发送的参数是参数格式(?name=章三&age=20),不能发送json数据
Post和put:发送的参数是json格式({“name”:“章三”,“age”:20})
(JSON中对象的属性名必须是双引号,属性值如果是字符串也必须是双引号)
application/x-www-form-urlencoded:name=章三 &age=20
application/json:{“name”:“章三”,“age”:20}
2.下面是1版的API文档:
#### (POST) /user/login 用户登录
- 请求地址: http://localhost:8080/user/login?uname={uname}&password={password}
可以看出与1.矛盾的地方:在用post请求格式时,采用了参数格式
下面是第2版的API文档:
#### (POST) /user/login 用户登录
- 请求地址: http://localhost:8080/user/login
- 请求参数:
userinfoForm:{
uname string #用户名
password string #密码
}
可以看出:在用post请求格式时,采用了json格式
在第2版的时候,我配置了全局的请求头application/json,我使用登陆和创建用户的功能都成功了,这是因为刚好这两个功能都是post,采用json格式。而我使用搜索用户功能的时候,一直在报错required request body is missing。
3.
我当时以为问题在只于请求头中的Content-Type。我以为只要Content-Type与数据传输格式对应就行,但是忽略了数据传输格式是由请求方式是post还是get等决定的。
如果后端接受参数全改成application/json,但在使用get方法时,接收参数并不是json格式。
本来打算后端按照请求方法改成对应的请求参数,然后我把前端加一个拦截器,在请求准备发送时根据请求方法重新配置正确的请求头以及数据格式。
但是后端按照请求方法改成对应的请求参数之后,我没加拦截器就成功了