100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > php接收vue请求数据axios 详解vue axios用post提交的数据格式

php接收vue请求数据axios 详解vue axios用post提交的数据格式

时间:2023-08-15 13:09:32

相关推荐

php接收vue请求数据axios 详解vue axios用post提交的数据格式

Content-type的几种常见类型

一、是什么?

是Http的实体首部字段,用于说明请求或返回的消息主体是用何种方式编码,在request header和response header里都存在。

二、几个常用类型:

1、application/x-www-form-urlencoded

这应该是最常见的post编码方式,一般的表单提交默认以此方式提交,$ajax默认提交就是使用这种格式。大部分服务器语言对这种方式都有很好的支持。在PHP中,可以用$_POST[“key”]的方式获取到key的值,在node中我们可以使用querystring中间件对参数进行分离

1)浏览器的原生form表单

2) 提交的数据按照 key1=val1&key2=val2 的方式进行编码,key和val都进行了URL转码

POST []() HTTP/1.1

Content-Type: application/x-[www-form-urlencoded](http://www-form-urlencoded);charset=utf-8

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

2、multipart/form-data

这也是一种比较常见的post数据格式,我们用表单上传文件时,必须使form表单的enctype属性或者ajax的contentType参数等于multipart/form-data。

Submit

请求头看起来像这样

POST /foo HTTP/1.1Content-Length: 68137Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575

---------------------------974767299852498929531610575Content-Disposition: form-data; name="description"some text---------------------------974767299852498929531610575Content-Disposition: form-data; name="myFile"; filename="foo.txt"Content-Type: text/plain

(content of the uploaded file foo.txt)---------------------------974767299852498929531610575--

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

3、application/json

消息主体是序列化后的 JSON 字符串,这个类型越来越多地被大家所使用,axios默认提交就是使用这种格式。

POST []() HTTP/1.1

Content-Type: application/json;charset=utf-8{"title":"test","sub":[1,2,3]}

这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。

4、text/xml

是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范

POST []() HTTP/1.1

Content-Type: text/xml

examples.getStateName

41

三、axios 将post请求数据转为formdata

1、后台改变接收参数的方法

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就能拿到对应的值。这种方法比较简单,也不需要前台做过多修改。

2、其中发挥关键作用的是headers与transformRequest。其中headers是设置即将被发送的自定义请求头。transformRequest允许在向服务器发送前,修改请求数据。这样操作之后,后台querystring.parse(decodeURIComponent(data))获取到的就是类似于{ name: 'w', password: 'w' }的对象。代码如下:

axios({

url:'/api/index/getIndexlbt',

method:'post',

data: {

relevanceId:this.$route.params.id,

pictureType:4},

transformRequest: [function (data) {

let ret= ''

for (let it indata) {

ret+= encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'}returnret

}],

headers: {'Content-Type': 'application/x-www-form-urlencoded'}

})

3、使用qs库编码数据

import qs from 'qs';const data = { 'bar': 123};const options ={

method:'POST',

headers: {'content-type': 'application/x-www-form-urlencoded'},

data: qs.stringify(data),

url,

};

axios(options);

4、axios配置后,post提交formdata

var fd = newFormData()

fd.append('file', files[0])

let config={

headers: {'Content-Type': 'multipart/form-data'}

}

axios.post(that.uploadUrl, fd,config).then( res=>{

console.log(res)

}).catch( res =>{

console.log(res)

})

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。