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 相关文章推荐
JS JavaScript获取Url参数,src属性参数
Mar 09 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
Nov 30 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
Apr 12 Javascript
用js小类库获取浏览器的高度和宽度信息
Jan 15 Javascript
使用js在页面中绘制表格核心代码
Sep 16 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
详解JavaScript逻辑Not运算符
Dec 04 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
Dec 25 Javascript
javascript实现表单验证
Jan 29 Javascript
addEventListener()与removeEventListener()解析
Apr 20 Javascript
AngularJS入门教程一:路由用法初探
May 27 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 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
PHP 网页过期时间的控制代码
2009/06/29 PHP
PHP 引用文件技巧
2010/03/02 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
javascript实现鼠标点击生成文字特效
2019/12/24 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
python 生成目录树及显示文件大小的代码
2009/07/23 Python
Python编写登陆接口的方法
2017/07/10 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
详解python读取image
2019/04/03 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
zooplus意大利:在线宠物商店
2019/08/07 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
餐饮业的创业计划书范文
2013/12/26 职场文书
承办会议欢迎词
2014/01/17 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
行政申诉状范文
2015/05/20 职场文书
行政处罚事先告知书
2015/07/01 职场文书
文艺演出主持词
2015/07/01 职场文书
初中运动会前导词
2015/07/20 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers