vue.js封装使用request.js

代码

import axios from 'axios';
import { MessageBox, Message } from 'element-ui';
import store from '@/store';
import router from '@/router';
import { setToken, getToken, removeToken } from "@/utils/cookies";

// create an axios instance
const service = axios.create({
    baseURL: store.state.baseDomain, // http://localhost:21021/
    // withCredentials: true, // send cookies when cross-domain requests
    //timeout: 5000 // request timeout
    //`xsrfCookieName`是要用作 xsrf 令牌的值的cookie的名称
    xsrfCookieName: 'XSRF-TOKEN', // default
    // `xsrfHeaderName`是携带xsrf令牌值的http头的名称
    xsrfHeaderName: 'X-XSRF-TOKEN', // default
})

// request interceptor
service.interceptors.request.use(
    config => {
        // do something before request is sent
        let token = getToken();
        if (token != undefined && token != '') {
            // let each request carry token
            // ['X-Token'] is a custom headers key
            // please modify it according to the actual situation
            config.headers['Authorization'] = 'Bearer ' + token;
        }
        return config
    },
    error => {
        // do something with request error
        // console.log(error) // for debug
        return Promise.reject(error)
    }
)

// response interceptor
service.interceptors.response.use(
    /**
       * If you want to get http information such as headers or status
       * Please return  response => response
      */

    /**
       * Determine the request status by custom code
       * Here is just an example
       * You can also judge the status by HTTP Status Code
       */
    response => {
        const res = response.data

        if (res.__abp) {
            return handleResponse(response)
        }

        // if the custom code is not 20000, it is judged as an error.
        if (response.status !== 200) {

            Message({
                message: res.message || 'Error',
                type: 'error',
                duration: 5 * 1000
            })

            // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
            if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
                // to re-login
                MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
                    confirmButtonText: 'Re-Login',
                    cancelButtonText: 'Cancel',
                    type: 'warning'
                }).then(() => {
                    store.dispatch('resetToken').then(() => {
                        location.reload()
                    })
                })
            }
            return Promise.reject(new Error(res.message || 'Error'))
        } else {
            return res
        }
    },
    error => {
        // console.log('response error =>', error.response) // for debug
        if (error.response.data.__abp) {
            return handleResponse(error.response)
        }
        Message({
            message: error.message,
            type: 'error',
            duration: 5 * 1000
        })
        return Promise.reject(error)
    }
)

/**
 * 请求结果重新组织
 * 参考 Abp 的 js 是 abp.ng.js
 * @param {*} response
 */
function handleResponse(response) {
    var originalData = response.data
    if (originalData.success === true) {
        response.data = originalData.result
        return response
    } else if (originalData.success === false) {
        // var messagePromise = null

        if (response.status == 401 && response.config.abpHandleError !== false) {
            // abp.ng.http.handleUnAuthorizedRequest(messagePromise, originalData.targetUrl);
            // 会话过期,跳转到登录页
            store.dispatch('resetToken').then(_ => {
                router.push(`/login?redirect=${location.hash.replace('#', '')}${location.search}`).catch(() => { })
            })
            originalData.error.message = '为了您的帐号安全,请重新登录';
        }

        if (originalData.error) {
            if (response.config.abpHandleError !== false) {
                Message.error(originalData.error.message || '请求出错了!!!')
            }
        } else {
            originalData.error = defaultError
        }

        response.data = originalData.error
        return Promise.reject(response)

    } else {
        // not wrapped result
        return Promise.reject(response)
    }
}

window.request = service;
export default service

 示例:

import request from '@/utils/request'

export function login(data) {
    return request({
        url: `/api/TokenAuth/Authenticate`,
        method: 'post',
        data
    })
}
原文地址:https://www.cnblogs.com/xsj1989/p/14341459.html