前言

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

优点

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

安装与引用

  1. CDN引入

    1
    <script src="https://cdn.staticfile.org/axios/0.19.0/axios.min.js"></script>
  2. npm安装与引入

    1
    $ npm install axios
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
        import axios from 'axios'
    ```

    # 创建axios对象(vue为例)
    ```js
    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

调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 引用上面创建的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