axiospost提交formdata的实例
vue框架推荐使⽤axios来发送ajax请求,之前我还写过来讲解如何在vue组件中使⽤axios。但之前做着玩⽤的都是get请求,现在我⾃⼰搭博客时使⽤了post⽅法,结果发现后台(node.js)完全拿不到前台传来的参数。后来进过⼀番探索,终于发现问题所在。
post提交数据的四种编码⽅式
1.application/x-www-form-urlencoded
这应该是最常见的post编码⽅式,⼀般的表单提交默认以此⽅式提交。⼤部分服务器语⾔对这种⽅式都有很好的⽀持。在PHP 中,可以⽤$_POST[“key”]的⽅式获取到key的值,在node中我们可以使⽤querystring中间件对参数进⾏分离
app.post("/server",function(req,res){
<("data",function(data){
let key=querystring.parse(decodeURIComponent(data)).key;
console.log("querystring:"+key)
});
});
2.multipart/form-data
这也是⼀种⽐较常见的post数据格式,我们⽤表单上传⽂件时,必须使form表单的enctype属性或者ajax的contentType参数等于multipart/form-data。使⽤这种编码格式时发送到后台的数据长得像这样⼦
不同字段以--boundary开始,接着是内容描述信息,最后是字段具体内容。如果传输的是⽂件,还要包含⽂件名和⽂件类型信息
3.application/json
axios默认提交就是使⽤这种格式。如果使⽤这种编码⽅式,那么传递到后台的将是序列化后的json字符串。我们可以将application/json与application/x-www-form-urlencoded发送的数据进⾏⽐较
⾸先是application/json:
接着是application/x-www-form-urlencoded:
这⾥可以明显看出application/x-www-form-urlencoded上传到后台的数据是以key-value形式进⾏组织的,⽽application/json 则直接是个json字符串。如果在处理application/json时后台还是采⽤对付application/x-www-form-urlencoded的⽅式将会产⽣问题。
例如后台node.js依然采⽤之前对付application/x-www-form-urlencoded的⽅法,那么
querystring.parse(decodeURIComponent(data))之后得到的数据是这样⼦的
这个时候再querystring.parse(decodeURIComponent(data)).key只能获取到undefined
js获取json的key和value剩下的⼀种编码格式是text/xml,这种格式我没有怎么使⽤过
解决⽅法
既然我们知道axios post⽅法默认使⽤application/json格式编码数据,那么解决⽅案就有两种,⼀是后台改变接收参数的⽅法,另⼀种则是将axios post⽅法的编码格式修改为application/x-www-form-urlencoded,这样就不需要后台做什么修改了。
先来看第⼀种解决⽅法
vue组件中,axios发送post请求的代码如下
this.$axios({
method:"post",
url:"/api/haveUser",
data:{
name:this.name,
password:this.password
}
}).then((res)=>{
console.log(res.data);
})
此时控制台Network Headers⾥⾯的信息是这样⼦的
后台接收数据需要依赖body-parser中间件,我们事先装好,接着在后台代码中引⽤body-parser
这张截图中,发挥作⽤的代码仅仅是const bodyParser=require("body-parser");
接下来在路由中使⽤body-parser
app.post("/api/haveUser",bodyParser.json(),function(req,res){
console.log(req.body);
let haveUser=require("../api/server/user.js");
haveUser(req.body.name,req.body.password,res);
});
这时,当前台发送post请求之后,后台控制台中就会打印出req.body
这时,通过req.body.name或者req.body.password就能拿到对应的值。
这种⽅法⽐较简单,也不需要前台做过多修改,推荐使⽤这种⽅法。
第⼆种解决⽅法,具体操作如下
前端
this.$axios({
method:"post",
url:"/api/haveUser",
headers:{
'Content-type': 'application/x-www-form-urlencoded'
},
data:{
name:this.name,
password:this.password
},
transformRequest: [function (data) {
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
return ret
}],
}).then((res)=>{
console.log(res.data);
})
其中发挥关键作⽤的是headers与transformRequest。其中 headers 是设置即将被发送的⾃定义请求头。 transformRequest 允许在向服务器发送前,修改请求数据。这样操作之后,后台querystring.parse(decodeURIComponent(data))获取到的就是类似于{ name: 'w', password: 'w' }的对象。
后台代码如下
app.post("/api/haveUser",function(req,res){
let haveUser=require("../api/server/user.js");
<("data",function(data){
let name=querystring.parse(decodeURIComponent(data)).name;
let password=querystring.parse(decodeURIComponent(data)).password;
console.log(name,password)
haveUser(name,password,res);
});
});
这种⽅法明显就要⽐第⼀种⿇烦⼀点,但不需要后台做过多处理。所以具体操作还是得根据实际情况决定。
以上这篇axios post提交formdata的实例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论