美文网首页
请求接口封装

请求接口封装

作者: locky丶 | 来源:发表于2019-12-11 15:34 被阅读0次

    import axios from 'axios'
    import { Message, MessageBox, Loading } from 'element-ui'
    import router from '@/router'
    import { getToken, removeToken } from '@/utils/auth'

    // 创建axios实例
    const service = axios.create({
    baseURL: process.env.BASE_API,
    withCredentials: true,
    timeout: 10 * 1000 // 请求超时时间
    })

    // 白名单
    const whiteList = ['/api/core/logout']

    // showFullScreenLoading() tryHideFullScreenLoading() 要干的事儿就是将同一时刻的请求合并。
    // 声明一个变量 needLoadingRequestCount,每次调用showFullScreenLoading方法 needLoadingRequestCount + 1。
    // 调用tryHideFullScreenLoading()方法,needLoadingRequestCount - 1。needLoadingRequestCount为 0 时,结束 loading。
    let needLoadingRequestCount = 0
    // loading实例
    let fullLoading
    // 有请求报错(403)
    let hasRequestError = false
    export const showLoading = () => {
    if (needLoadingRequestCount === 0) {
    fullLoading = Loading.service({
    background: 'rgba(0, 0, 0, .5)',
    text: '加载中',
    spinner: 'el-icon-loading'
    })
    }
    needLoadingRequestCount++
    }

    export const tryHideLoading = () => {
    if (needLoadingRequestCount <= 0) return
    needLoadingRequestCount--
    if (needLoadingRequestCount === 0) {
    fullLoading.close()
    }
    }

    // request拦截器
    service.interceptors.request.use(
    config => {
    if (config.url !== '/api/core/pcLogin' && !getToken()) {
    return Promise.reject()
    }
    // 白名单内的地址不显示loading
    if (whiteList.indexOf(config.url) < 0) {
    showLoading()
    }
    // 让每个请求携带自定义token 请根据实际情况自行修改
    config.headers['token'] = getToken()
    return config
    },
    error => {
    return Promise.reject(error)
    }
    )

    // response 拦截器
    service.interceptors.response.use(
    response => {
    /**
    * code为非0是抛错 可结合自己业务进行修改
    */
    const res = response.data
    if (res.code !== 0) {
    const codeObject = {
    '408': '服务器等待客户端发送的请求时间过长,超时',
    '500': res.msg
    }
    // 403为token失效
    if (res.code === 403) {
    if (hasRequestError) {
    return
    } else {
    hasRequestError = true
    Message({
    message: '登录信息失效,请重新登录',
    type: 'error'
    })
    fullLoading.close()
    removeToken()
    router.replace('/login')
    }
    } else {
    let message = ``
    message = codeObject[${res.code}]
    if (!message) {
    message = Http请求异常,请联系管理员
    // router.replace('/login')
    }
    Message({
    message,
    type: 'error',
    duration: 3 * 1000
    })
    }
    return Promise.reject('error')
    } else {
    hasRequestError = false
    tryHideLoading()
    return response.data
    }
    },
    error => {
    if (getToken()) {
    Message({
    message: Http请求异常,请联系管理员,
    type: 'error',
    duration: 5 * 1000
    })
    } else {
    console.log(error)
    }
    // return Promise.reject(error)
    }
    )

    // 将axios 的 post 方法
    export function $post(url, params) {
    return new Promise((resolve, reject) => {
    service
    .post(url, params)
    .then(res => {
    resolve(res)
    })
    .catch(err => {
    reject(err)
    })
    })
    }

    // 将axios 的 put 方法
    export function $put(url, params) {
    return new Promise((resolve, reject) => {
    service
    .put(url, params)
    .then(res => {
    resolve(res)
    })
    .catch(err => {
    reject(err)
    })
    })
    }

    // 将axios 的 delete 方法
    export function $delete(url, params) {
    return new Promise((resolve, reject) => {
    service
    .delete(url, params)
    .then(res => {
    resolve(res)
    })
    .catch(err => {
    reject(err)
    })
    })
    }

    // 将axios 的 get 方法
    export function $get(url, params) {
    return new Promise((resolve, reject) => {
    service
    .get(url, {
    params: params
    })
    .then(res => {
    resolve(res) // 返回请求成功的数据 data
    })
    .catch(err => {
    reject(err)
    })
    })
    }

    相关文章

      网友评论

          本文标题:请求接口封装

          本文链接:https://www.haomeiwen.com/subject/xdoogctx.html