关于Vue开发的问题(axios封装)

在博客中查找vue的axios封装,发现其中案例还是很多的,自己项目中有些需求不够。
比如
1、Content-Type 请求头 application/x-www-form-urlencoded和application/json两种方式的应用
2、请求方式增加delete方式,
3、出现跨域,以及其他问题。
做了些修改。做个记录

首先放出引用的源代码

引用来源于 vue axios 封装 全局调用axios
感谢 爱吃排骨 给予的帮助

import axios from "axios"
import qs from "qs"
axios.defaults.timeout=3000   //响应时间
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';        //配置请求头
axios.defaults.baseURL =process.env.NODE_HOST;   //配置接口地址
console.log(process.env)
//POST传参序列化(添加请求拦截器)
axios.interceptors.request.use((config) => {//在发送请求之前做某件事let token = sessionStorage.getItem('access_token') || ""  //获取token console.log(token)if (token!="") {config.headers = {'access-token': token,'Content-Type': 'application/x-www-form-urlencoded'}}    if(config.method  === 'post'){config.data = qs.stringify(config.data)//序列化post 参数}return config;
},(error) =>{console.log('错误的传参')return Promise.reject(error);
});
//返回状态判断(添加响应拦截器)
axios.interceptors.response.use((res) =>{//对响应数据做些事if(!res.data.success){let newToken=res.data.token    //成功后更新token localStorage.setItem('access_token', newToken)}return res;
}, (error) => {if(error.response.data.status=='401'){    //如果token 过期 则跳转到登录页面this.$router.push('/login');}return Promise.reject(error);
});
//返回一个Promise(发送post请求)function post(url, params) {return new Promise((resolve, reject) => {axios.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})
}
//返回一个Promise(发送get请求)function get(url, param) {return new Promise((resolve, reject) => {axios.get(url, {params: param}).then(response => {resolve(response)}, err => {reject(err)}).catch((error) => {reject(error)})})
}
export default {get,post,
}

直接粘贴过去使用的问题 — 。—!

1、第4行请求头的的问题
2、第5行env文件未说明如何应用
3、第14行,token 名称的问题
4、第18行,当随意使用qs进行转序列化post参数 ,参数有时候想在body又有时候想在url的问题
5、新加delete,download下载方式
6、响应拦截器的修改

1、第4行请求头的的问题

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
这里看到他是给axios添加默认的请求头为:'application/x-www-form-urlencoded;'本身这样写是没有错误的,但是只是默认了提交方式为表单提交,如果我们请求传输数据呢?就必须改为'application/json'
所以…为了能正常使用我又create另外一个axios2

let axios2 = axios.create()
axios2.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';        //配置请求头

问题来了,万一get方式的请求头也是这,咋办,所以干脆写在请求拦截器里

axios.interceptors.request.use((config) => {//在发送请求之前做某件事 //请求之前加入tokenlet token = sessionStorage.getItem("token") || ""  //获取token if (token != "") {config.headers = {'authorization': token, //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/x-www-form-urlencoded'}}if (config.method === 'post') {config.data = qs.stringify(config.data)//序列化post 参数}return config;
}, (error) => {console.log('错误的传参')return Promise.reject(error);
});
axios2.interceptors.request.use((config) => {//     //在发送请求之前做某件事 //请求之前加入tokenlet token = sessionStorage.getItem("token") || ""  //获取token if (token != "") {config.headers = {'authorization': token, //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/json;charset=UTF-8'}}return config;
}, (error) => {console.log('错误的传参')return Promise.reject(error);
});

对!只有axiosaxios2,以及 'Content-Type'发生变化,是不是感觉繁琐了很多,没错!但是胜在能用么,如果这个地方写不对,请求会报400,参数错误。稍后我会放出完整版的,需要的直接拉到最下面吧
那么在下面封装get,或者post 的时候,只需要使用两个不同的axios就行。举例:

//返回一个Promise(发送post请求:'Content-Type'为form方式)
function post(url, params) {return new Promise((resolve, reject) => {axios.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})//返回一个Promise(发送post请求:'Content-Type'为json方式)
function jsonpost(url, params) {return new Promise((resolve, reject) => {axios2.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})
}

有点流水账的意思,还是那句话。。。。。当时能用就行

2、第5行env文件未说明如何应用

这个请参考我的其他博客《Vue开发问题——打包后首页白屏》

3、第14行,token 名称的问题

排骨老哥不地道(可能是我实在太菜),token名称是后端定的,得随时改,所以下面这个地方:'access-token',得换成自己后端的token名称,在1问题中,我封装的拦截器,我的项目里名称是叫 authorization'

if (token!="") {config.headers = {'access-token': token,'Content-Type': 'application/x-www-form-urlencoded'}}

4、第18行,当随意使用qs进行转序列化post参数 ,参数有时候想在body又有时候想在url的问题

细心的小伙伴可能发现了,我在封装两种请求拦截器的时候axios,比axios2多了亿点点内容

if (config.method === 'post') {config.data = qs.stringify(config.data)//序列化post 参数}

所以如果在'application/json'模式下,后端本来设置是在body中获取数据,那么你再qs去转换下,那么等你的就只有400

5、新加delete,download下载方式

直接上代码

function deletefn(url, params) {return new Promise((resolve, reject) => {axios.delete(url+[params]).then(response => {resolve(response)},err => {reject(err)}).catch(err => {reject(err)})});
}function download(url, params) {return new Promise((resolve, reject) => {axios2.post(url, params, {responseType: 'blob'}).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})
}

这里注意了,删除的方式我是axios.delete(url+[params]),你们看自己后台的接口,可能会是axios.delete(url+'/'+[params]),这个 / 你们自己把握 [/滑稽]
至于下载请求嘛,是项目中一个导出列表信息的功能,具体请参考我的其他博客《vue开发问题——导出文本流》

6、响应拦截器的修改

axios.interceptors.response.use((res) => {// 对响应数据做些事if (res.data&&res.data.code&&res.data.code == 401) {console.log(this);router.push('/');}return res;
});

作用是如果返回码401(无权限,或session过期)我就利用router去跳转到登录页
原博主设置的是如果登录的成功,就更新token,我这项目不需要,所以就偷个懒,有需要的可以自己试一试
这里有个小插曲,再这里引用router 必须是 ../ 比如:

import router from "../router"

最后记得自己封装的方法要 export 导出哦~
下面是我完整的代码,另外,还会附上axios封装简化版解决上述的'Content-Type'问题

import axios from "axios"
import qs from "qs"
import router from "../router"let axios2 = axios.create()
axios.defaults.timeout = 7000   //响应时间
axios2.defaults.timeout = 7000
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';        //配置请求头
axios.defaults.baseURL = process.env.VUE_APP_BASE_API;   //配置接口地址根目录
axios2.defaults.baseURL = process.env.VUE_APP_BASE_API;
// //POST传参序列化(添加请求拦截器)
axios.interceptors.request.use((config) => {//在发送请求之前做某件事 //请求之前加入tokenlet token = sessionStorage.getItem("token") || ""  //获取token if (token != "") {config.headers = {'authorization': token, //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/x-www-form-urlencoded'}}if (config.method === 'post') {config.data = qs.stringify(config.data)//序列化post 参数}return config;
}, (error) => {console.log('错误的传参')return Promise.reject(error);
});
// 返回状态判断(添加响应拦截器)
axios.interceptors.response.use((res) => {
//   //对响应数据做些事if (res.data&&res.data.code&&res.data.code == 401) {router.push('/');}return res;
});axios2.interceptors.request.use((config) => {//     //在发送请求之前做某件事 //请求之前加入tokenlet token = sessionStorage.getItem("token") || ""  //获取token if (token != "") {config.headers = {'authorization': token, //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/json;charset=UTF-8'}}return config;
}, (error) => {console.log('错误的传参')return Promise.reject(error);
});axios2.interceptors.response.use((res) => {// 对响应数据做些事if (res.data&&res.data.code&&res.data.code == 401) {router.push('/');}return res;
});
//返回一个Promise(发送请求头为application/json的post请求)
function jsonpost(url, params) {return new Promise((resolve, reject) => {axios2.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})
}function jsonget(url, params) {return new Promise((resolve, reject) => {axios2.get(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})
}function jsondelete(url, params) {return new Promise((resolve, reject) => {axios2.delete(url, {data:params}).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})
}//返回一个Promise(发送post请求)
function post(url, params) {return new Promise((resolve, reject) => {axios.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})
}
返回一个Promise(发送get请求)
function get(url, param) {return new Promise((resolve, reject) => {axios.get(url, { params: param }).then(response => { resolve(response) }, err => { reject(err) }).catch((error) => { reject(error) })})
}
function deletefn(url, params) {return new Promise((resolve, reject) => {axios.delete(url+[params]).then(response => {resolve(response)},err => {reject(err)}).catch(err => {reject(err)})});
}function download(url, params) {return new Promise((resolve, reject) => {axios2.post(url, params, {responseType: 'blob'}).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})
}export default {get,post,deletefn,jsonpost,jsonget,jsondelete,download
}

简化版

function requset(config){return new Promise((resolve,reject)=>{axios({url:config.url,method:config.method,headers:{'authorization': config.token||'', //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/json'||config.headers.Content-Type},params:config.params}).then(res=>{resolve(res)}).catch(err=>{reject(err)})})}

其他地方调用

LoginInternet2(){this.$ajax.requset({url:"/login",method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded"},params:this.params}).then(res =>{console.log(res);}).catch(err => {console.log(err);})},

'authorization': config.token||'', 表示如果传入就是使用传入的token,没传就不写,其实这里还可以做个简化的,直接添加拦截器就都解决了。'Content-Type': 'application/json'||config.headers.Content-Type 这个表示如果没穿就是默认json,传入就使用传入的
下面的案例为了方便,参数我就直接写再方法里了,一般是应该在data里面定义config:{…},去传参数的。我懒嘛~
更新(其实是打错了)————————————————————————————————
第1个问题里,上面写的我为了创建axios2.去使用application/json 请求头 但是,axios少个2,后面的请求头也打错了 。。囧,原文已经更改了

let axios2 = axios.create()
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';        //配置请求头

帮到你的话,点个赞吧d=====( ̄▽ ̄*)b

原作者姓名:Lazy33
原出处:CSDN
原文链接:Vue开发问题(axios封装)_Lazy33的博客-CSDN博客

axios post body参数_Vue开发中的一些问题(axios封装)相关推荐

  1. vue ui无效_vue开发中,父组件添加scoped之后。解决在父组件中无法修改子组件样式问题。...

    在vue的开发中,我们需要引用子组件,包括ui组件(element.iview).但是在父组件中添加scoped之后,在父组件中书写子组件的样式是无效果的.去掉scoped之后,样式可以覆盖.但这样会 ...

  2. vue 后台获取数据 下拉框_Vue开发中的一些常见套路和技巧

    属性排放 管理请求加载状态 Proxy跨域 对developer和build的打包进行不同配置 大部分开发者都喜欢将Vue的config写在一个文件中,看起来是没有问题,但是随着环境的变化,项目优化, ...

  3. axios post body参数_vue之axios封装

    在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响应.取消请求.转换js ...

  4. vue单文件props写法_vue开发中怎么按需加载需要被填入props和自定义事件的组件?...

    这种场景你可能需要把模态框包装成插件.vue插件开发和组件的区别 - 水秋玄​im.mkinit.com vue插件和组件的区别 使用插件的方式包装组件和直接注册全局组件其实是一样的,都是注册组件.不 ...

  5. android 中自定义安装,Android开发中ListView自定义adapter的封装

    [引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...

  6. axios vue 回调函数_vue中的ajax请求和axios包详解

    在vue中,经常会用到数据请求,常用的有:vue-resourse.axios 首先,引入axios CDN: npm: npm install axios 并在全局的js中引入:import axi ...

  7. axios vue 回调函数_vue中ajax请求与axios包完美处理

    这次给大家带来vue中ajax请求与axios包完美处理,vue中ajax请求与axios包处理的注意事项有哪些,下面就是实战案例,一起来看一下. 在vue中,经常会用到数据请求,常用的有:vue-r ...

  8. axios get 某个参数是数组怎么传_Vue 中 Axios 的封装和 API 接口的管理

    我们所要的说的axios的封装和api接口的统一管理,其实主要目的就是在帮助我们简化代码和利于后期的更新维护. 一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios ...

  9. axios vue 回调函数_Vue 02 —— Vue 入门小案例~使用 Axios 中的GET、POST请求

    作为后端攻城狮,写前端代码是一种什么体验? 相信不少人和 @Python大星 一样,有写过前端代码的经历. 记录一下,Vue 框架开发中"啼笑皆非"的故事,非专业前端人员,该案例无 ...

最新文章

  1. Array K-Coloring
  2. Python-常用模块
  3. Xcode Developer Tools
  4. 给你自己的博客加个 Markdown
  5. 使用apache.commons.fileupload 进行文件上传
  6. python函数的调用方式_Python中函数参数调用方式分析
  7. 浅谈OpenGOP与ClosedGOP
  8. 如何用计算机克数和斤换算,克数换算斤计算器(克千克斤公斤计算器)
  9. [iuud8]ios不同版本下推送本地通知
  10. 求职指导课程测试题(学习自测使用)
  11. android黑色背景图片,android显示PNG图片背景黑色问题 ImageView PNG 背景黑色
  12. Android 常用颜色列表
  13. 【时间序列分析】03. 谱密度
  14. (JAVA编成练习):递归的使用,简单的列子帮你理解递归。
  15. linux及林纳斯-托沃兹
  16. 深度学习之生成对抗网络(5)纳什均衡
  17. MMR 算法信息收集
  18. android版音乐播放器----卡拉OK歌词实现(二)
  19. 半年卖出4.6亿只粽子,老字号的“想象空间”有多大?
  20. ARP miss消息限速

热门文章

  1. pandas使用select_dtypes函数移除dataframe中指定数据类型的数据列(exclude columns based on the data type in dataframe)
  2. R语言使用table函数计算单分类变量的频率表(frequency table)、使用prop.table函数将table函数计算获得的频率表转化为比率表、返回单分类变量每一个类别的比率、或者百分比
  3. 机器学习数据预处理之离群值/异常值:箱图法(boxplot method)
  4. 机器学习数据预处理之缺失值:后向填充
  5. 模型诊断(Model Diagnostics)是什么?具体包含哪些内容?
  6. 回归分析评估指标均方对数误差(MSLE)详解及其意义:Mean Squared Log Error
  7. 统计简单学_基本概念
  8. boost:从0到1开发boost(linux、clion)
  9. java+long.builder_Java LongStream.Builder accept()用法及代码示例
  10. python 字典 转 pandas DataFrame