vue axios封装httpjs,接口公用配置拦截操作


Posted in Javascript onAugust 11, 2020

做一下记录,在vue项目中配置公用的请求https,

(1) 位置,在src中新建 src/utils/http.js

import axios from 'axios' // 引用axios
import { MessageBox, Message } from 'element-ui'
import Qs from 'qs' //引入数据格式化
import router from '@/router'
 
// axios 配置
axios.defaults.timeout = 50000 //设置接口响应时间
// axios.defaults.baseURL = 'https://easy-mock.com/mock/' // 这是调用数据接口,公共接口url+调用接口名
let httpUrl = window.location.host
if (httpUrl.indexOf('.com') !== -1) {
 console.log('生产环境', httpUrl)
} else if (httpUrl.indexOf('.net') !== -1) {
 console.log('测试环境', httpUrl)
 axios.defaults.baseURL = 'http://www.test.com' // 这是调用数据接口,公共接口url+调用接口名
} else if (httpUrl.indexOf('localhost:8088') !== -1) {
 console.log('指定开发环境', httpUrl)
 axios.defaults.baseURL = 'http://localhost:8088/'
} else {
 console.log('开发环境', httpUrl)
 axios.defaults.baseURL = 'http://192.168.6.138:8080/' // 这是调用数据接口,公共接口url+调用接口名
}
 
// http request 拦截器,通过这个,我们就可以把Cookie传到后台
axios.interceptors.request.use(
 config => {
  if (config.method == "post") {
  // console.log('请求路径', config.url)
  if (config.url === '/b/login/checkLogin') {
   config.headers = {
    'Content-Type': 'application/x-www-form-urlencoded' // 设置跨域头部
   }
   config.data = Qs.stringify(config.data)
  } else if (config.url === '/b/carModel/createCarModelVersion') {
   // 此处设置文件上传,配置单独请求头
   config.headers = {
    'Content-Type': 'multipart/form-data'
   }
  } else {
   let userInfo = localStorage.getItem('userInfo')
   if (userInfo === null) {
    return null
   }
   let bToken = localStorage.getItem('btoken')
   if (bToken === null) {
   } else {
    config.data.vwToken = bToken
   }
   config.headers = {
    'Content-Type': 'application/x-www-form-urlencoded' // 设置跨域头部
   }
   config.data = Qs.stringify(config.data)
  }
}else{
console.log("get请求")
}
  return config
 },
 err => {
  return Promise.reject(err)
 }
)
 
// http response 拦截器
axios.interceptors.response.use(
 response => {
  // console.log('请求拦截返回参数', response)
  if (response.status === 200) {
   // 成功
   let returnCode = response.data.code
   if (returnCode > 10000 && returnCode < 20000) {
    // console.log('成功', response)
    Message.success(response.data.msg)
   } else if (returnCode >= 20000 && returnCode < 30000) {
    // 只弹窗,不操作
    // console.log('失败1', response)
    Message.error(response.data.msg)
   } else if (returnCode >= 30000 && returnCode < 40000) {
    // 只弹窗,点击跳到登入页
    localStorage.removeItem('userInfo')
 
    MessageBox.confirm(response.data.msg, '确定登出', {
     confirmButtonText: '重新登录',
     cancelButtonText: '取消',
     type: 'warning'
    }).then(() => {
     // console.log('此处应退出登录 重新实例化')
     router.push({ path: '/login' })
    })
   }
  }
  return response
 },
 error => {
  // console.log('error', error.toString())
  if (
   error.toString().trim() ===
   "TypeError: Cannot read property 'cancelToken' of null"
  ) {
   localStorage.removeItem('userInfo')
   MessageBox.confirm(
    '会话凭证失效,可以取消继续留在该页面,或者重新登录',
    '确定登出',
    {
     confirmButtonText: '重新登录',
     cancelButtonText: '取消',
     type: 'warning'
    }
   ).then(() => {
    // console.log('此处应退出登录 重新实例化')
    router.push({ path: '/login' })
   })
  }
 
  // console.log(error.toString().trim())
  if (error.toString().trim() === 'Error: Network Error') {
   MessageBox.alert('网络请求异常,请稍后重试', '出错了', {
    confirmButtonText: '确定',
    callback: action => {}
   })
  }
  return Promise.reject(error.response.data)
 }
)
 
export default axios
 
/**
 * fetch 请求方法
 * @param url
 * @param params
 * @returns {Promise}
 */
export function get(url, params = {}) {
 return new Promise((resolve, reject) => {
  axios
   .get(url, {
    params: params
   })
   .then(response => {
    resolve(response.data)
   })
   .catch(err => {
    reject(err)
   })
 })
}
 
/**
 * post 请求方法
 * @param url
 * @param data
 * @returns {Promise}
 */
export function post(url, data = {}) {
 return new Promise((resolve, reject) => {
  axios.post(url, data).then(
   response => {
    // console.log(response.data.code)
    resolve(response.data)
   },
   err => {
    reject(err)
   }
  )
 })
}
 
/**
 * patch 方法封装
 * @param url
 * @param data
 * @returns {Promise}
 */
export function patch(url, data = {}) {
 return new Promise((resolve, reject) => {
  axios.patch(url, data).then(
   response => {
    resolve(response.data)
   },
   err => {
    reject(err)
   }
  )
 })
}
 
/**
 * put 方法封装
 * @param url
 * @param data
 * @returns {Promise}
 */
export function put(url, data = {}) {
 return new Promise((resolve, reject) => {
  axios.put(url, data).then(
   response => {
    resolve(response.data)
   },
   err => {
    reject(err)
   }
  )
 })
}

(2) 在main.js中引入调用,定义全局

import axios from 'axios'
import { post, get, patch, put } from './utils/http'
 
// 将axios添加到原型链上
Vue.prototype.$axios = axios
 
// 定义全局变量
Vue.prototype.$post = post
Vue.prototype.$get = get
Vue.prototype.$patch = patch
Vue.prototype.$put = put

(3)在需要用到的.vue页面直接使用

//this.logForm 为传参
 
this.logForm = { id: this.selectId, knowledgeVersionId: this.baseValue }
this.$post('你的url', this.logForm).then(req => {
    this.logList = req.data
    this.logList.allCount = req.allCount
    this.logList.nowPage = req.nowPage
    this.logList.pageSize = req.pageSize
    this.loading = false
   }).catch(err => {
    console.log(err)
   })
 
 this.$post('/b/checkConfig/updateRelateKnowledge', { id: this.selectId, knowledgeVersionId: this.baseValue }).then(req => {
    console.log(req)
    if (req.code === 10000) {
     // this.options = req.data
     this.getConfigList()
    }
   }).catch(err => {
    console.log(err)
   })

补充知识:Vue项目关于axios的二次封装service

一、安装axios:npm i axios --save

二、在src目录下新建文件service.js

三、在service.js文件中写入以下代码

import axios from 'axios'

// 创建一个拥有通用配置的axios实例,实例中的配置内容根据实际开发需求而定
export const service = axios.create({
 baseURL: 'http://***.***.*.**:8080/', // 测试环境
 timeout: 1000 * 10, // 请求超时的毫秒数,如果请求花费超过timeout的时间,请求将被中断
 withCredentials: true, // 表示跨域请求时是否需要使用凭证,默认fasle
 headers: { 'Cache-Control': 'no-cache' } // 不允许缓存,需要重新获取请求
})

// 添加请求拦截器
service.interceptors.request.use(config => {
 // 在发送请求之前做些什么
 return config
}, error => {
 // 对请求错误做些什么
 return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(response => {
 // 对响应数据做点什么
 return response
}, error => {
 // 对响应错误做点什么
 return Promise.reject(error)
})

以上是对axios的初步封装,具体功能根据实际需求在service.js文件中进行配置

四、全局使用使用service(也可以局部使用,稍后会说明局部使用方法)

第一步:在main.js中进行挂载

import { service } from './service'

Vue.prototype.service = service

第二步:使用

// 注意:这里必须要使用async 和 await ,不然请求状态一直是Promise {<pending>},拿不到请求数据
 async created () {
  let data = await this.service.get('menu/user/tree')
  console.log(data) //此时能拿到请求的数据
 }

五、局部使用service,在组件内先引入再使用

<script>
import { service } from '../service'
export default {
 name: 'HelloWorld',
 data () {
  return {
   msg: 'sds'
  }
 },
 async created () {
  let data = await service.get('menu/user/tree')
  console.log(data)
 }
}
</script>

以上这篇vue axios封装httpjs,接口公用配置拦截操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用innerhtml提高页面打开速度的方法
Aug 02 Javascript
javascript按位非运算符的使用方法
Nov 14 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
Jun 12 Javascript
jQuery实现底部浮动窗口效果
Sep 07 Javascript
微信小程序 video组件详解
Oct 25 Javascript
基于Bootstrap仿淘宝分页控件实现代码
Nov 07 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
Nov 17 Javascript
深入浅析Vue.js中 computed和methods不同机制
Mar 22 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
Mar 29 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
Apr 29 Javascript
Vue实现点击按钮复制文本内容的例子
Nov 09 Javascript
javaScript中indexOf用法技巧
Nov 26 Javascript
解决vue刷新页面以后丢失store的数据问题
Aug 11 #Javascript
封装 axios+promise通用请求函数操作
Aug 11 #Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 #Javascript
vue 调用 RESTful风格接口操作
Aug 11 #Javascript
vue之封装多个组件调用同一接口的案例
Aug 11 #Javascript
vue接口请求加密实例
Aug 11 #Javascript
vue组件暴露和.js文件暴露接口操作
Aug 11 #Javascript
You might like
下载文件的点击数回填
2006/10/09 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
php pdo操作数据库示例
2017/03/10 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
javascript定义函数的方法
2010/12/06 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
python中常用的数据结构介绍
2021/01/12 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
欢送退休感言
2014/02/08 职场文书
出纳员的岗位职责
2014/02/22 职场文书
户外宣传策划方案
2014/05/25 职场文书
节水口号标语
2014/06/19 职场文书
个人四风问题整改措施
2014/10/24 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
基于tensorflow权重文件的解读
2021/05/26 Python