最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【Vue-Element-Admin 分析】- 02 网络请求的是怎么封装的?

    正文概述 掘金(初心Yearth)   2020-12-21   534

    显然,这个问题的核心在于 axios 的封装和使用。

    封装

    我们首先来看看封装,这个很好找,要么是 services 要么是 request,很快就定位到了具体的文件:utils/request.js

    简单分析一下,不难看出,整个文件大致宏观框架如下:

    const service = axios.create({/*...*/})

    service.interceptors.request.use(onFulfilled, onRejected)
    service.interceptors.response.use(onFulfilled, onRejected)

    export default service

    整体的思路是:创建实例 → 添加请求和响应拦截器 → 导出实例。

    下面具体看看这几步:

    创建实例

    const service = axios.create({
      baseURL: process.env.VUE_APP_BASE_API,
      timeout: 5000
    })

    没什么好说的,设定了 baseURLtimeout,当然 axios 还有非常多其他的配置,这里以分析 vue-element-admin 学习经验为主要目的,就不罗列其他属性,感兴趣的读者可以自行查阅:axios 中文文档 - 请求配置

    请求拦截器

    service.interceptors.request.use(
      config => {
        if (store.getters.token) {
          config.headers['X-Token'] = getToken()
        }
        return config
      },
      error => {
        console.log(error)
        return Promise.reject(error)
      }
    )

    显然,请求拦截器的核心功能就是为请求加上 token 信息。

    响应拦截器

    service.interceptors.response.use(
      response => {
        const res = response.data

        if (res.code !== 20000) {
          Message({
            message: res.message || 'Error',
            type: 'error',
            duration: 5 * 1000
          })

          if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
            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('user/resetToken').then(() => {
                location.reload()
              })
            })
          }
          return Promise.reject(new Error(res.message || 'Error'))
        } else {
          return res
        }
      },
      error => {
        console.log('err' + error)
        Message({
          message: error.message,
          type: 'error',
          duration: 5 * 1000
        })
        return Promise.reject(error)
      }
    )

    响应拦截器的主要功能则是做各种错误处理。

    至此,不难看出,axios 的封装,核心思路如下:

    • 创建实例,设定 baseURLtimeout
    • 在请求拦截器中设定 token
    • 在响应拦截器中做错误处理,包括 token 失效清空信息以及各种错误提示等

    那么,如何在项目中使用网络请求呢?

    其实这个问题也是相当简单就能找到答案得:/api ,所有的 api 请求都在这里成模块的封装,随便抽一个看看就明白了:

    import request from '@/utils/request'

    export function fetchList(query) {
      return request({
        url: '/vue-element-admin/article/list',
        method: 'get',
        params: query
      })
    }

    最后补上脑图:

    【Vue-Element-Admin 分析】- 02 网络请求的是怎么封装的?
    图片1

    起源地下载网 » 【Vue-Element-Admin 分析】- 02 网络请求的是怎么封装的?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元