axios封装以及API接口管理

在src文件夹下新建api文件夹,并新建index.js用来作为axios封装

index.js 代码如下:

import axios from 'axios'
import config from '../config/server.js'
import qs from 'qs'
import Vue from 'vue'
import { getToken } from '../utils/common'

import { Message } from 'elementUI'

/** **** 创建axios实例 ******/
const service = axios.create({
  baseURL: config.apiPathPrefix, // api 的 base_url
  timeout: 150000 // request timeout
})
Vue.prototype.$http = service
/** **** //取消请求标记 ******/
const CancelToken = axios.CancelToken

/** **** //拦截器 ******/
service.interceptors.request.use(config => {
  const oldHeaders = config.headers || {}
  config.headers = {
    common: {},
    'X-CSRF-TOKEN': getToken(),
    ...oldHeaders
  }
  config.headers.common = {
    'X-Requested-With': 'XMLHttpRequest'
  }

  if (config.method === 'get') {
    config.params = { ...config.params, _t: Date.now() }
  }
  return config
})
service.interceptors.response.use(
  res => {
    if (res.data.type === -2) {
      Message.error({
        showClose: true,
        message: res.data.msg
      })
    }
    return Promise.resolve(res)
  },
  err => {
    const rp = err.response.status
    if (rp === 401 || rp === 403 || rp === 302) {
      skipLogin()
    } else {
      // window.app.feedback();
      Message.error({
        showClose: true,
        message: '服务器内部错误'
      })
    }
    return Promise.reject(err)
  }
)
export default {
  source: CancelToken.source(),
  resetSource () {
    this.source = axios.CancelToken.source()
  },
  fetchPost (url, params, isSucMsg, alertTitle, headers) {
    return new Promise((resolve, reject) => {
      service
        .post(`${url}${config.apiPathSuffix}`, params, {
          headers,
          cancelToken: this.source.token
        })
        .then(res => {
          // window.app.feedback(res.data, isSucMsg, alertTitle);
          // console.log('res', res)
          resolve(res.data)
        })
        .catch(err => {
          // window.app.feedback();
          reject(err)
        })
    })
  },
  fetchPostForm (url, params, isSucMsg, alertTitle, headers) {
    return new Promise((resolve, reject) => {
      service
        .post(`${url}${config.apiPathSuffix}`, qs.stringify(params), {
          headers: Object.assign(
            {
              'Content-Type': 'application/x-www-form-urlencoded'
            },
            headers
          ),
          cancelToken: this.source.token
        })
        .then(res => {
          // window.app.feedback(res.data, isSucMsg, alertTitle);
          resolve(res.data)
        })
        .catch(err => {
          // window.app.feedback();
          reject(err)
        })
    })
  },
  fetchPostJson (url, params, isSucMsg, alertTitle, headers) {
    return new Promise((resolve, reject) => {
      service
        .post(`${url}${config.apiPathSuffix}`, params, {
          headers: Object.assign(
            {
              'Content-Type': 'application/json;charset=UTF-8'
            },
            headers
          )
        })
        .then(res => {
          // window.app.feedback(res.data, isSucMsg, alertTitle);
          resolve(res.data)
        })
        .catch(err => {
          // window.app.feedback();
          reject(err)
        })
    })
  },
  fetchGet (url, params, isSucMsg, headers) {
    return new Promise((resolve, reject) => {
      service
        .get(`${url}${config.apiPathSuffix}`, {
          params,
          headers
        })
        .then(res => {
          // window.app.feedback(res.data, isSucMsg);
          resolve(res.data)
        })
        .catch(err => {
          // window.app.feedback();
          reject(err)
        })
    })
  },
  fetchGetNoTip (url, params, isSucMsg, headers) {
    return new Promise((resolve, reject) => {
      service
        .get(`${url}${config.apiPathSuffix}`, { params, headers })
        .then(res => {
          resolve(res.data)
        })
        .catch(err => {
          // window.app.feedback();
          reject(err)
        })
    })
  }
}
// 跳至cas登录
function skipLogin () {
  if (process.env.NODE_ENV !== 'development') {
    window.location.reload()
  }
}

server.js  代码如下:

// const baseContext = 'ctm01ivtrack-web'
const baseContext = 'ctm01soiportal'
const DEBUG = process.env.NODE_ENV === 'development'
module.exports = {
  baseContext: baseContext,
  apiPathPrefix: `/${baseContext}/`,
  apiPathSuffix: '.do',
  sysPath: DEBUG ? '/' : `/${baseContext}/`,
  isDev: DEBUG,
  // target: 'http://10.192.33.37:17010'
  // target: 'http://10.192.33.25:17010'
  target: 'http://10.192.33.27:3179'
}

common.js  代码如下:

const getToken = () => {
  let token = ' '
  let metas = document.getElementsByTagName('meta')

  for (let meta of metas) {
    if (meta.getAttribute('name') === '_csrf') {
      token = meta.getAttribute('content')
    }
  }
  return token
}

然后就是接口如何调用的问题了:

在api下新建模块接口js文件,代码如下:

import api from './index.js'
// 获取菜单
function getMenuList (...args) {
  return api.fetchGet('/menu/getMenu', ...args)
}
// 退出
function signOut (...args) {
  return api.fetchGet('/menu/logout', ...args)
}
export default {
  getMenuList,
  signOut
}

最后在vue中引入对应js接口文件调用接口

import api from '@/api/demo'

async getList () {
   let res = await api.getMenuList()
 },

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值