详解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://www.example.com](http://www.example.com) 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。

<form action="/" method="post" enctype="multipart/form-data">
  <input type="text" name="description" value="some text">
  <input type="file" name="myFile">
  <button type="submit">Submit</button>
</form>

请求头看起来像这样

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

---------------------------974767299852498929531610575
Content-Disposition: form-data; name="description"

some text
---------------------------974767299852498929531610575
Content-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://www.example.com](http://www.example.com) 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://www.example.com](http://www.example.com) HTTP/1.1 
Content-Type: text/xml 
<!--?xml version="1.0"?--> 
<methodcall> 
    <methodname>examples.getStateName</methodname> 
    <params> 
        <param> 
            <value><i4>41</i4></value> 
    </params> 
</methodcall>

三、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 in data) {
             ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
           }
           return ret
         }],
         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 = new FormData()
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)
})
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Axios是一个基于Promise的HTTP库,用于在浏览器端和Node.js中发送HTTP请求。它可以用于发送GET和POST请求。 GET请求是用于从服务器获取数据的请求方式。使用Vue Axios发送GET请求的方法如下: ```javascript this.$axios.get(url) .then(response => { // 处理返回的数据 }) .catch(error => { // 处理错误 }); ``` POST请求是用于向服务器发送数据的请求方式。可以使用FormData对象发送文件或其他对象作为参数。使用Vue Axios发送POST请求的方法如下: ```javascript let url = 'http://127.0.0.1:8000/uploadimage/'; let formData = new FormData(); formData.append('img', blobInfo.blob()); this.$axios.post(url, formData) .then(response => { // 处理返回的数据 }) .catch(error => { // 处理错误 }); ``` 当发送POST请求时,可以根据需要设置Content-Type,常见的资源类型包括`application/x-www-form-urlencoded`、`multipart/form-data`、`application/json`和`application/xml`。默认情况下,Content-Type为`application/x-www-form-urlencoded`。 以上是使用Vue Axios发送GET和POST请求的方法。希望能对您有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue axios数据请求get、post方法及实例详解](https://download.csdn.net/download/weixin_38732519/12952521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue实战032:axios使用get和post发送各种请求](https://blog.csdn.net/kevinfan2011/article/details/95312771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值