• 技术文章 >web前端 >js教程

    axios+post方法提交formdata步骤详解

    php中世界最好的语言php中世界最好的语言2018-05-10 15:36:33原创19329
    这次给大家带来axios+post方法提交formdata步骤详解,axios+post方法提交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){
     req.on("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

    4.text/xml

    剩下的一种编码格式是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");
     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);
     });
    });

    这种方法明显就要比第一种麻烦一点,但不需要后台做过多处理。所以具体操作还是得根据实际情况决定。

    相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

    推荐阅读:

    echarts鼠标覆盖高亮显示节点关系数实现步骤

    vue1与vue2获取dom元素步骤详解

    以上就是axios+post方法提交formdata步骤详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:axios+post formdata 步骤
    上一篇:vue-router使用总结(附代码) 下一篇:在vue里使用axios步骤详解
    大前端线上培训班

    相关文章推荐

    • javascript如何将数字转为字符串• javascript如何改变HTML内容• javascript如何求图形的面积• javascript中字符串怎么转换成数组• javascript如何制作验证码

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网