vue中使用Axios第三方库,采用形式提交,参数格式为multipart /格式数据  ,请求参数变为对象格式的解决办法。(推荐第二种方法

提交数据的四种编码方式

一,应用/ X WWW的窗体-urlencoded 
这应该是最常见的后编码方式,一般的表单提交默认以此方式提交。大部分服务器语言对这种方式都有很好的支持。在PHP中,可以用$ _ POST [“钥匙”]的方式获取到关键的值,在节点中我们可以使用查询字符串中间件对参数进行分离

app.post("/server",function(req,res){
    req.on("data",function(data){
        let key=querystring.parse(decodeURIComponent(data)).key;
        console.log("querystring:"+key)
    });
});
  •  

2.multipart /格式数据 
这也是一种比较常见的后数据格式,我们用表单上传文件时,必须使形式表单的加密类型属性或者AJAX的内容类型参数等于多部分/格式的数据。使用这种编码时格式到发送后台的数据长得像这样子  不同字段以开始,接着是内容描述信息,最后是字段具体内容。如果传输的是文件,还要包含文件名和文件类型信息
这里写图片描述 
--boundary

3.application / json 
axios默认提交就是使用这种格式。如果使用这种编码方式,那么传递到后台的将是序列化后的json字符串。我们可以将application / json与application / x-www-form -urlencoded的发送数据进行比较 
首先应用的英文/ JSON:  接着是应用程序/ x-WWW窗体-urlencoded:  这里可以明显看出应用程序/ x-WWW窗体-urlencoded上传到后台的数据是以键值形式进行组织的,而应用程序/ JSON则直接是个JSON字符串。如果在处理的应用程序/ JSON时后台还是采用对付应用程序/ x-WWW窗体-urlencoded的方式将会产生问题。例如后台的node.js依然采用之前对付应用程序/ x-WWW窗体-urlencoded的方法,那么之后得到的数据的英文这样子的  这个时候再只能电子杂志到未定义
这里写图片描述 

这里写图片描述 
querystring.parse(decodeURIComponent(data))
这里写图片描述 
querystring.parse(decodeURIComponent(data)).key

4.text / XML 
剩下的一种编码格式是文本/ XML,这种格式我没有怎么使用过

解决方法

既然我们知道axios post方法默认使用application / json格式编码数据,那么解决方案就有两种,一是后台改变接收参数的方法,另一种则是将axios post方法的编码格式修改为application / x- WWW窗体-urlencoded,这样就不需要后台做什么修改了。 
先来看第一种解决方法 
VUE组件中,爱可信发送后请求的代码如下

this.$axios({
    method:"post",
    url:"/api/haveUser",
    data:{
        name:this.name,
        password:this.password
    }
}).then((res)=>{
    console.log(res.data);
})

控制台此时标题网络里面的信息的英文这样子的  后台接收数据需要依赖中间件,我们事先装好,接着在后台代码中引用体解析器  这张截图中,作用英文发挥的代码仅仅的英文接下来在路由中使用身体解析器
这里写图片描述 
body-parser
这里写图片描述 
const bodyParser=require("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);
});

这时,当前台发送后请求之后,后台控制台就会中出打印这时,通过或者就能拿到对应的值。  这种方法比较简单,也不需要前台做过多修改,推荐使用这种方法。req.body 
这里写图片描述 
req.body.namereq.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);
})

其中发挥关键作用的是标头与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");
      req.on("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);
      });
});
Logo

前往低代码交流专区

更多推荐