详解vue axios用post提交的数据格式


Posted in Javascript onAugust 07, 2018

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。使用这种编码格式时发送到后台的数据长得像这样子

详解vue axios用post提交的数据格式 

不同字段以--boundary开始,接着是内容描述信息,最后是字段具体内容。如果传输的是文件,还要包含文件名和文件类型信息

3.application/json

axios默认提交就是使用这种格式。如果使用这种编码方式,那么传递到后台的将是序列化后的json字符串。我们可以将application/json与application/x-www-form-urlencoded发送的数据进行比较

首先是application/json:

详解vue axios用post提交的数据格式 

接着是application/x-www-form-urlencoded:

详解vue axios用post提交的数据格式 

这里可以明显看出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))之后得到的数据是这样子的

详解vue axios用post提交的数据格式 

这个时候再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里面的信息是这样子的

详解vue axios用post提交的数据格式 

后台接收数据需要依赖body-parser中间件,我们事先装好,接着在后台代码中引用body-parser

详解vue axios用post提交的数据格式 

这张截图中,发挥作用的代码仅仅是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

详解vue axios用post提交的数据格式 

这时,通过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);
  });
});

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 数组的正态分布排序的问题
Jul 31 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
Nov 25 Javascript
微信小程序 scroll-view隐藏滚动条详解
Jan 16 Javascript
设置cookie指定时间失效(实例代码)
May 28 Javascript
jQuery 实现图片的依次加载图片功能
Jul 06 jQuery
浅谈Vue.nextTick 的实现方法
Oct 25 Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
May 13 Javascript
详解js删除数组中的指定元素
Oct 31 Javascript
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
用JS实现选项卡
Mar 23 Javascript
vue判断按钮是否可以点击
Apr 09 Vue.js
解决koa2 ctx.render is not a function报错问题
Aug 07 #Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 #Javascript
echarts实现地图定时切换散点与多图表级联联动详解
Aug 07 #Javascript
详解Nuxt.js部署及踩过的坑
Aug 07 #Javascript
解决vue 中 echart 在子组件中只显示一次的问题
Aug 07 #Javascript
Nuxt配合Node在实际生产中的应用详解
Aug 07 #Javascript
React-router4路由监听的实现
Aug 07 #Javascript
You might like
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
基于JQuery的多标签实现代码
2012/09/19 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
python中entry用法讲解
2020/12/04 Python
python中最小二乘法详细讲解
2021/02/19 Python
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
韩国11街:11STREET
2018/03/27 全球购物
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
环卫工作个人总结
2015/03/04 职场文书
爱心捐助活动总结
2015/05/09 职场文书
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers