热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue中使用axios的一些注意点

2019独角兽企业重金招聘Python工程师标准1.基本使用现在我们的团队使用的基本都是axios发起请求,使用方式如下在service.js文件中返回prom

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. 基本使用
  • 现在我们的团队使用的基本都是axios发起请求,使用方式如下
  • 在service.js文件中返回promise对象

import config from '@/config'
import axios from 'axios'
export default{/*启用停用*/setB2bStoreGoodsBlackUpOrDown(data) {return new Promise(function (resolve, reject) {const url = `${config.server.http}${config.server.host}/b2b-seller-admin/setStoreGoodsBlackUpOrDown`axios.post(url, data).then(function (data) {resolve(data)}).catch(function (error) {reject(error)})})},/*一个接口查黑名单*/getListB2bCanaleStoreGoodsBlacks(data) {return new Promise(function (resolve, reject) {const url = `${config.server.http}${config.server.host}/b2b-seller-admin/page/getListCanaleStoreGoodsBlacks`axios.post(url, data).then(function (data) {resolve(data)}).catch(function (error) {reject(error)})})},
}

  • 在组件中调用方法,使用async await语句,外层加try catch 捕获异常

import advService from '@B2B/services/substatAdmin/advService.js'
import scrollMixins from '@/mixins/scrollMixins.js'
import config from '@/config'
import storage from '@/utils/storage.js'export default {mixins: [scrollMixins],data() {return {con1:false,con10:false,locationoptions: [],B2bAdv: {siteid: null,sort: 0,picUrl: "",openTpye: 0}}},methods: {async saveAdv(){let flag = this.Formrule()if (flag) {try {this.B2bAdv.startTime = this.B2bAdv.timevalue[0].getTime().toString().substr(0, 13)this.B2bAdv.endTime = this.B2bAdv.timevalue[1].getTime().toString().substr(0, 13)const data = await advService.addB2bAdv(this.B2bAdv)if (data.status == 200 && data.data.result) {this.closeTab()} else {console.log(data.status.statusReason)this.$customMessage("新增失败", "error")}}catch (e) {this.$customMessage("新增失败", "error")console.log(e)}}}}
}
2. 自定义请求头

  • 在开发过程中,我们所有的请求现在都要走网关,而且网关需要传递userId和token做鉴权,如果在每个请求中都要写,那么会很麻烦,这个时候我们需要使用axios的拦截器
  • 创建如图所示的文件夹结构

225656_aQdW_1416844.jpg

  • 代码实现

/** 在main.js的入口文件引入request.js* *//***全局配置配置***/
// axios请求配置
import '@/utils/request/request.js'

/** request.js* *//** @Author: 石国庆* @Desc: 所有axios的拦截器,默认配置都可以写在这里* @Date: 2017.11.14* */import config from '@/config/index.js'
// 开关控制
if (config.setting.customHttpHeader) {// 这里面没法用import// 添加用户id的请求头require('@/utils/request/header.js')// import '@/utils/request/header.js'
}

/** header.js* *//** @Author: 石国庆* @Desc: axios的请求头,用于添加网关需要的userId和token自定义请求头* @Date: 2017.11.14* */
import globalConfig from '@/config/index.js'
import storage from '@/utils/storage.js'
import axios from 'axios'// 这点的重点就是不能写死,还要把这个方法导出去,因为还要兼容用ajax写的老代码
let func = function (config) {// 开关控制if (globalConfig.setting.permission) {if (storage.getItem('SGQ.global.userAuthor') != null) {// 这里的config包含每次请求的内容config.headers.userId = storage.getItem('SGQ.global.userAuthor').idconfig.headers.token = storage.getItem('SGQ.global.userAuthor').tokenconfig.headers.userName = storage.getItem('SGQ.global.userAuthor').userNameconfig.headers.orgId = storage.getItem('SGQ.global.userAuthor').orgId}} else {// 这里的config包含每次请求的内容config.headers.userId = '2167676703289898'config.headers.token = 'eyJhbGciOiJIUzUxMiJ9.eyJrtrtriOiIyMTYwMDMyIiwiaWF0IjoxNTA5MTYwOTIzfQ.Gz6eKAkimLg7777777777777777777777777ZZF2KiX01ux7OVphfGmUT6o9q-n5eJxN0RA99evCHpfyR78gbVg'config.headers.userName = 'cj'config.headers.orgId = 1}return config
}// 使用请求的拦截器
axios.interceptors.request.use(func, function (err) {return err
})export default func

  • 自定义请求头问题
    • 自定义请求头遇到了一个问题,userId,token,这些参数都不是http请求头中默认的属性,所以浏览器会先向后端服务发起一个option的预请求,当服务器响应在请求头中可以加这些自定义属性的时候,浏览器才会发起真实的get或者post数据请求
      • 参考:http://blog.csdn.net/enter89/article/details/51205752
    • 所以这个时候后端需要把跨域都设置为*,否则会报跨域问题
3. 用拦截器统一处理错误信息
  • 我们可以利用axios的拦截器,做统一的错误状态码处理
    • 比如401状态码跳转登录页
    • token过期校验等跳转
  • 代码实现

/** 新建一个error.js,然后在request.js文件中引入* *//** @Author: 石国庆* @Desc: axios的请求头,用于添加网关需要的userId和token自定义请求头* @Date: 2017.11.14* */
import globalConfig from '@/config/index.js'
import storage from '@/utils/storage.js'
import axios from 'axios'let errFunc=function (error) {if (error.response) {switch (error.response.status) {case 401:// 返回 401 清除token信息并跳转到登录页面router.replace({path: 'login',query: {redirect: router.currentRoute.fullPath}})}}// 返回接口返回的错误信息return error.response.data
}// 使用请求的拦截器
axios.interceptors.response.use(function (response) {return response
},errFunc)export default errFfunc
4. 参考和引用 5. 特别感谢

  • 公司的小伙伴
6. 免责说明
  • 本文档中的部分内容摘自网上的众多博客,仅作为自己知识的补充和整理,并分享给其他需要的coder,不会用于商用。
  • 因为很多博客的地址看完没有及时做保存,所以很多不会在这里标明出处,非常感谢各位大牛的分享,也希望大家理解。
  • 如果原文作者感觉不适,可以及时联系我shiguoqing999@163.com,我将及时删除争议部分内容
7. 追责声明
  • 如有大段引用超过全文50%的内容,请在文档结尾标明原文出处:龙马行空-石国庆-朱庇特-https://my.oschina.net/u/1416844/blog,否则将视为抄袭,予以法律追究,请各位尊重个人知识产权。

转:https://my.oschina.net/u/1416844/blog/1586631



推荐阅读
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
author-avatar
扈菁雄佳纯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有