我是靠谱客的博主 含糊宝马,最近开发中收集的这篇文章主要介绍axios post封装对象到后端_axios.js以post方式传递数据后台获取不到数据,这到底是什么原因...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这篇文章始于自己封装了axios.js的里面的get方法,和post方法

首先我们先来看看使用说明 · Axios 中文说明 · 看云​www.kancloud.cn

axios.post()方法

axios({

method: 'post',

url: '/user/123456',

data: {

username: 'ken',

password: '123456'

}

})

axios.post('/user', {

firstName: 'Fred',

lastName: 'Flintstone'

})

axios.get()方法

axios({

method: 'get',

url: '/user/123456',

})

// 可选地,上面的请求可以这样做

axios.get('/user', {

params: {

ID: 12345

}

})

这个下面是我的封装的伪代码

//伪代码的编写

axios({

method: 'post' || 'get',

url: '/user/123456',

data: {

username: 'ken',

password: '123456',

} || params: {

ID: '123456'

}

})

我一开始的封装的方式是这样的

// eslint-disable-next-line

/* eslint-disable */

// 对 axios.get() 和 axios.post()进行封装

import axios from 'axios'

import qs from 'qs'

/*

post 方式

axios({

method: 'post',

url: '/user/123456',

data: {

username: 'ken',

password: '123456'

}

})

axios.post('/user', {

firstName: 'Fred',

lastName: 'Flintstone'

})

get 方式

axios({

method: 'get',

url: '/user/123456',

})

// 可选地,上面的请求可以这样做

axios.get('/user', {

params: {

ID: 12345

}

})

//伪代码的编写

axios({

method: 'post' || 'get',

url: '/user/123456',

data: {

username: 'ken',

password: '123456',

} || params: {

ID: '123456'

}

})

*/

export default function axios_get_post(params){

return new Promise((resolve, reject)=>{

let opt = {

method: params.method || 'get',

url: params.url,

}

if(params.method == 'post'){

opt.data = params.data

}else {

//

opt.params = params

}

axios(opt).then(res=>{

resolve(res.data)

}).catch(err=>{

reject(err)

})

})

}

但是当我在这样调用测试接口的时候,

created() {

// 测试封装

axios_get_post({

method: 'post',

url: 'http://xxx.com/account/admin/login.php',

data: {

user_name: 'kennana',

user_pass: '123456'

}

}).then(res=>{

console.log('axios_get_post res',res)

}).catch(err=>{

console.log('axios_get_post err',err)

})

},

出现一个问题就是后台获取不到数据,后台返回的数据是null

后台设置如下

控制到检测到数据为Request Payload状态,

request payload的数据状态是因为content-type:application/json

关键就是设置Content-type这个Header为application/x-www-form-urlencoded,实际上对于常规的HTML页面上的form的Content-type默认就是这个值。

这里要注意post请求的Content-Type为application/x-www-form-urlencoded,参数是在请求体中,即上面请求中的Form Data。

因为浏览器post传递数据一般是以表单的形式传递的,而我上面的方式是以json的方式传递的,所以我们必须告诉服务端是以表单形式传递的,所以要设置请求头的content-type

HTTP POST表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使用原生AJAX的POST请求如果不指定请求头RequestHeader,默认使用的Content-Type是text/plain;charset=UTF-8。

当然,设置了application/x-www-form-urlencoded的POST请求也可以通过这种方式来获取。

所以,在使用原生AJAX POST请求时,需要明确设置Request Header,即:

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

同样使用axios.post()传输的时候也要设置content-type

所以上面封装的代码改成如下:

// eslint-disable-next-line

/* eslint-disable */

// 对 axios.get() 和 axios.post()进行封装

import axios from 'axios'

import qs from 'qs'

/*

post 方式

axios({

method: 'post',

url: '/user/123456',

data: {

username: 'ken',

password: '123456'

}

})

axios.post('/user', {

firstName: 'Fred',

lastName: 'Flintstone'

})

get 方式

axios({

method: 'get',

url: '/user/123456',

})

// 可选地,上面的请求可以这样做

axios.get('/user', {

params: {

ID: 12345

}

})

//伪代码的编写

axios({

method: 'post' || 'get',

url: '/user/123456',

data: {

username: 'ken',

password: '123456',

} || params: {

ID: '123456'

}

})

*/

export default function axios_get_post(params){

return new Promise((resolve, reject)=>{

let opt = {

method: params.method || 'get',

url: params.url,

headers: {

'Content-Type':'application/x-www-form-urlencoded'

},

}

if(params.method == 'post'){

opt.data = params.data

}else {

//

opt.params = params

}

axios(opt).then(res=>{

resolve(res.data)

}).catch(err=>{

reject(err)

})

})

}

但是这样是解决问题了,但是又有一个问题来,我们来看看

真是一波平,一波起啊,查了一下文档,有个全局拦截器,可以在数据请求前先处理好数据,

所以我们要引入qs库

import qs from 'qs'

全局拦截器

在请求或响应被 then 或 catch 处理前拦截它们。

// 添加请求拦截器

axios.interceptors.request.use(function (config) {

// 在发送请求之前做些什么

return config;

}, function (error) {

// 对请求错误做些什么

return Promise.reject(error);

});

// 添加响应拦截器

axios.interceptors.response.use(function (response) {

// 对响应数据做点什么

return response;

}, function (error) {

// 对响应错误做点什么

return Promise.reject(error);

});

所以我们要来改造我上面的那个封装了

// eslint-disable-next-line

/* eslint-disable */

// 对 axios.get() 和 axios.post()进行封装

import axios from 'axios'

import qs from 'qs'

/*

post 方式

axios({

method: 'post',

url: '/user/123456',

data: {

username: 'ken',

password: '123456'

}

})

axios.post('/user', {

firstName: 'Fred',

lastName: 'Flintstone'

})

get 方式

axios({

method: 'get',

url: '/user/123456',

})

// 可选地,上面的请求可以这样做

axios.get('/user', {

params: {

ID: 12345

}

})

//伪代码的编写

axios({

method: 'post' || 'get',

url: '/user/123456',

data: {

username: 'ken',

password: '123456',

} || params: {

ID: '123456'

}

})

*/

export default function axios_get_post(params){

return new Promise((resolve, reject)=>{

let opt = {

method: params.method || 'get',

url: params.url,

headers: {

'Content-Type':'application/x-www-form-urlencoded'

},

}

if(params.method == 'post'){

opt.data = params.data

}else {

//

opt.params = params

}

// 拦截处理

axios.interceptors.request.use((req) => {

if (req.method === 'post') {

req.data = qs.stringify(req.data);

}

return req;

}, (error) => Promise.reject(error));

axios(opt).then(res=>{

resolve(res.data)

}).catch(err=>{

reject(err)

})

})

}

终于解决了

更多请参考

最后

以上就是含糊宝马为你收集整理的axios post封装对象到后端_axios.js以post方式传递数据后台获取不到数据,这到底是什么原因...的全部内容,希望文章能够帮你解决axios post封装对象到后端_axios.js以post方式传递数据后台获取不到数据,这到底是什么原因...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部