将 axios 扩展为 Vue 插件

为 Vue 扩展插件:https://cn.vuejs.org/v2/guide/plugins.html

我们在使用 axios 的时候遇到了一些问题:

请求拦截器

src/assets/js/http.js:

  1. import axios from 'axios'
  2. import {getToken} from './auth'
  3. const http = axios.create({
  4. baseURL: 'http://localhost:8888/api/private/v1/'
  5. })
  6. // 我们这里使用 http 请求拦截器的目的是为了解决:每次请求需要授权的API手动在请求头中加 Token 令牌的问题
  7. // 添加请求拦截器
  8. // 拦截器的本身就是一个方法
  9. // 该方法什么时候执行?
  10. // 拦截器函数接收一个参数 config
  11. // config 就是你当前请求的配置对象
  12. // 当你使用 axios 发起请求的时候,那么就会先经过这个拦截器然后再发出请求
  13. // 也就是说在请求拦截器内部的请求还没有发出去
  14. // 我们可以在这里定制请求之前的行为
  15. http.interceptors.request.use(function (config) {
  16. // 如果本次请求的不是 /login 接口,则我们就加入请求头
  17. if (config.url !== '/login') {
  18. config.headers['Authorization'] = getToken()
  19. }
  20. // return config 就好比 next() 允许通过
  21. // 通过之后才要真正的发起请求
  22. return config
  23. }, function (error) { // 当请求出错的时候会调用到第二个参数函数
  24. // Do something with request error
  25. return Promise.reject(error)
  26. })
  27. // 建议通过定义插件的配置来扩展 Vue 本身
  28. // 1. 定义一个插件对象
  29. const httpPlugin = {}
  30. // 2. 为插件对象添加一个成员:install
  31. // install 是一个函数
  32. // 该函数接收两个参数:Vue、options
  33. //
  34. // Vue.use(httpPlugin) 会来调用 install 方法
  35. httpPlugin.install = function (Vue, options) {
  36. // 3. 添加实例方法
  37. Vue.prototype.$http = http
  38. }
  39. // 4. 导出插件对象
  40. export default httpPlugin
  41. // 5. 在入门文件模块 main.js 加载使插件生效
  42. // Vue.use(httpPlugin)

然后在 src/main.js 文件中加载插件使之生效:

  1. // ...代码略
  2. import httpPlugin from '@/assets/js/http'
  3. Vue.use(httpPlugin)
  4. // ...代码略

接下来我们就可以在组件中直接通过 this.$http 来使用 axios 了。

  1. async created () {
  2. // ...代码略
  3. const res = await this.$http.get('/users', {
  4. // ...代码略
  5. })
  6. // ...代码略
  7. }