axios post提交formdata的实例


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

axios post提交formdata的实例

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

3.application/json

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

首先是application/json:

axios post提交formdata的实例

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

axios post提交formdata的实例

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

axios post提交formdata的实例

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

axios post提交formdata的实例

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

axios post提交formdata的实例

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

axios post提交formdata的实例

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

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

以上这篇axios post提交formdata的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
从sohu弄下来的flash中展示图片的代码
Apr 27 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
Aug 15 Javascript
详解Vue单元测试case写法
May 24 Javascript
vue的token刷新处理的方法
Jul 17 Javascript
react native 原生模块桥接的简单说明小结
Feb 26 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
Mar 20 Javascript
echarts多条折线图动态分层的实现方法
May 24 Javascript
extjs4图表绘制之折线图实现方法分析
Mar 06 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
May 09 Javascript
Element Badge标记的使用方法
Jul 27 Javascript
在vue组件中使用axios的方法
Mar 16 #Javascript
axios发送post请求,提交图片类型表单数据方法
Mar 16 #Javascript
Vue实现搜索 和新闻列表功能简单范例
Mar 16 #Javascript
vue axios 表单提交上传图片的实例
Mar 16 #Javascript
vue中实现图片和文件上传的示例代码
Mar 16 #Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
Mar 16 #Javascript
Vue实现active点击切换方法
Mar 16 #Javascript
You might like
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
很酷的星级评分系统原生JS实现
2016/08/25 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
python将txt文件读取为字典的示例
2018/12/22 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
会计毕业生自我鉴定
2013/11/04 职场文书
少先队入队活动方案
2014/02/08 职场文书
总裁助理岗位职责
2014/02/17 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
个人授权委托书范文
2014/09/21 职场文书
团日活动总结格式
2015/05/11 职场文书
为自己工作观后感
2015/06/11 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python