Vue使用axios 前言 优点 安装与引用 创建axios对象(vue为例) 调用

当然,ajax也可以用于实现数据请求,但是ajax通常适合MVC模型。同时ajax被封装与JQuery,我们总不能为例单次使用ajax而引用整个JQuery.

优点

  1. 使用简单,体积小
  2. 支持promise
  3. 能拦截请求和响应并处理(可用于处理token)
  4. 可防止CSRF(跨站请求伪造)攻击 -(在请求中附带cookie, 根据浏览器同源策略, 其它网站拿不到cookie,从而避免攻击)

安装与引用

  1. CDN引入
    <script src="https://cdn.staticfile.org/axios/0.19.0/axios.min.js"></script>
  1. npm安装与引入
    $ npm install axios
    import axios from 'axios'

创建axios对象(vue为例)

import axios from 'axios'
import { getToken, setToken } from '../utils/token'
import router from '../router/index'
const service = axios.create({
    // 设置超时时间 ms
    timeout: 60000,
    // 可设置根路径 带不带斜杠都行
    baseURL: '/api'
})

// 请求拦截器
service.interceptors.request.use(config => {
    const token = getToken()
    if (token) {
        // 为请求头添加token
        config.headers.token = token
    }
    return config
}, (error) => {
    return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(
    response => {
        // 如果返回未登录错误 返回登录页面
        if (response.data.LoginErr) {
            setToken('')
            router.replace({
                name: 'login'
            })
            return
        }
        return response
    },
    error => {
        if (error && error.response) {
            switch (error.response.status) {
                case 400:
                    error.message = '请求错误'
                    break
                case 401:
                    error.message = '未授权,请登录'
                    break
                case 403:
                    error.message = '拒绝访问'
                    break
                case 404:
                    error.message = `请求地址出错: ${error.response.config.url}`
                    break
                case 408:
                    error.message = '请求超时'
                    break
                case 500:
                    error.message = '服务器内部错误'
                    break
                case 501:
                    error.message = '服务未实现'
                    break
                case 502:
                    error.message = '网关错误'
                    break
                case 503:
                    error.message = '服务不可用'
                    break
                case 504:
                    error.message = '网关超时'
                    break
                case 505:
                    error.message = 'HTTP版本不受支持'
                    break
                default:
                    break
            }
        }
        return Promise.reject(error)
    }
)
export default service

调用

// 引用上面创建的axiox对象
import axios from './index'
// 也可以不创建直接使用
// import axios from 'axios'
const http = {
    request: function (url, data) {
        return new Promise((resolve, reject) => {
            axios({
                url: url,
                method: 'post',
                data: data
            })
                .then((res) => {
                    resolve(res.data)
                })
                .catch(function (error) {
                    reject(error)
                })
        })
    },
    get: function (url) {
        return new Promise((resolve, reject) => {
            axios.get(url)
                .then((response) => {
                    resolve(response.data)
                })
                .catch((error) => {
                    reject(error)
                })
        })
    },
    post: function (url, data) {
        return new Promise((resolve, reject) => {
            axios.post(url, data)
                .then((response) => {
                    resolve(response.data)
                })
                .catch((error) => {
                    reject(error)
                })
        })
    }
}
export default http