后台管理项目----axios的封装

2 篇文章 0 订阅

后台管理项目axios的封装

首先引用相关模块

// axios 引用
import axios from 'axios'

// 相关UI框架引用 本文用的 ant vue
import {message, Modal, notification} from 'ant-design-vue'

// vuex引用
import store from '../store'

// 本地存储引用
import db from './localstorage'

公共请求头的设置

const constURL = 'http://XXX.xxx.147.159:19527/'

// 统一配置
let JIEBAO_REQUEST = axios.create({
// 公共请求头
  baseURL: constURL,

// 类型
  responseType: 'json',

// `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte

  validateStatus (status) {
    // 200 外的状态码都认定为失败
    return status === 200
  }
})

拦截请求

// 拦截请求

// 添加请求拦截器
JIEBAO_REQUEST.interceptors.request.use((config) => {

  // 有 token就带上 从Vuex当中去除 token 

  if (store.state.account.token) {
// 添加到请求头
    config.headers.Authentication = store.state.account.token
  }
  return config
}, (error) => { // 对请求错误做些什么
  return Promise.reject(error)
})

响应拦截(根据响应返回的状态码来进行页面提示)

// 拦截响应
JIEBAO_REQUEST.interceptors.response.use((config) => {
  return config
}, (error) => {
  if (error.response) {
    let errorMessage = error.response.data === null ? '系统内部异常,请联系网站管理员' : error.response.data.message
    switch (error.response.status) {
      case 404:
        notification.error({
          message: '系统提示',
          description: '很抱歉,资源未找到',
          duration: 4
        })
        break
      case 403:
      case 401:
        if (!unLogin) {
          notification.warn({
            message: '系统提示',
            description: '很抱歉,您无法访问系统资源,可能是因为没有相应权限或者登录已失效',
            duration: 4
          })
          let secondsToGo = 5
          let modal = Modal.error({
            title: '系统提示',
            content: `很抱歉,您无法访问系统资源,可能是因为没有相应权限或者登录已失效, 将在 ${secondsToGo} 秒后自动跳转登录页面.`,
            okText: '重新登录',
            mask: false,
            onOk: () => {
              return new Promise((resolve, reject) => {
                db.clear()
                location.reload()
              })
            }
          })
          const interval = setInterval(() => {
            secondsToGo -= 1
            modal.update({
              content: `很抱歉,您无法访问系统资源,可能是因为没有相应权限或者登录已失效, 将在 ${secondsToGo} 秒后自动跳转登录页面.`
            })
          }, 1000)
          setTimeout(() => {
            clearInterval(interval)
            modal.destroy()
            return new Promise((resolve, reject) => {
              db.clear()
              location.reload()
            })
          }, secondsToGo * 1000)
          unLogin = true
        }
        break
      default:
        notification.error({
          message: '系统提示',
          description: errorMessage,
          duration: 4
        })
        break
    }
  }
  return Promise.reject(error)
})   

封装请求

POST 

// 封装post请求
post (url, params) {

//  axios原本的请求
    return JIEBAO_REQUEST.post(url, params, {

// transformRequest请求前更改请求数据格式 以 key=value&key=value 形式 保存

      transformRequest: [(params) => {
        let result = ''
// Object.keys提取参数中的key

        Object.keys(params).forEach((key) => {
          if (!Object.is(params[key], undefined) && !Object.is(params[key], null)) {

// encodeURIComponent() 函数可把字符串作为 URI 组件进行编码
            result += encodeURIComponent(key) + '=' + encodeURIComponent(params[key]) + '&'
          }
        })
        return result
      }],
// 请求头
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    })
  },

PUT 同上

GET 

get (url, params) {
    let _params

// Object.is 判断相等
    if (Object.is(params, undefined)) {
      _params = ''
    } else {
      _params = '?'
      for (let key in params) {

// hasOwnProperty 判断该属性是否为本身属性非继承属性

        if (params.hasOwnProperty(key) && params[key] !== null) {
          _params += `${key}=${params[key]}&`
        }
      }
    }
// 原生axios请求
    return JIEBAO_REQUEST.get(`${url}${_params}`)
  }

DELETE 同上

EXPORT

export (url, params = {}) {
// 框架提示
    message.loading('导出数据中')
// post方法
    return JIEBAO_REQUEST.post(url, params, {
      transformRequest: [(params) => {
        let result = ''
        Object.keys(params).forEach((key) => {
          if (!Object.is(params[key], undefined) && !Object.is(params[key], null)) {
            result += encodeURIComponent(key) + '=' + encodeURIComponent(params[key]) + '&'
          }
        })
        return result
      }],
// 请求头为blob 转换文件流
      responseType: 'blob'
    }).then((r) => {
// 获取到返回数据
      const content = r.data

// 通过Blob构造函数生成新的blob
      const blob = new Blob([content])
  // 设置下载文件名字
      const fileName = `${new Date().getTime()}_导出结果.xlsx`

// 检查浏览器兼容性 是否支持H5
      if ('download' in document.createElement('a')) {
        const elink = document.createElement('a')
        elink.download = fileName
        elink.style.display = 'none'

// 创建下载地址
        elink.href = URL.createObjectURL(blob)
        document.body.appendChild(elink)
        elink.click()

// 去除无关链接释放内存
        URL.revokeObjectURL(elink.href)
// 清除元素
        document.body.removeChild(elink)
      } else {
// 不支持 直接下载 Navigator.msSaveBlob()方法将“File或”保存Blob到磁盘
        navigator.msSaveBlob(blob, fileName)
      }
    }).catch((r) => {
      console.error(r)
      message.error('导出失败')
    })
  },
DOWNLOAD  同上

最后请求方法外面包裹一层reques对象 把request暴露出去 放进mian.js全局引用就可以了就完成

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前置知识: - Vue3.0 - Axios - 微服务 Axios是一个基于Promise的HTTP库,可以用于浏览器和Node.js。在Vue,我们通常使用Axios来发送HTTP请求。 微服务是一种面向服务架构的软件设计风格。它把一个应用划分为一些小的、独立的、可替换的服务,每个服务运行在自己的进程,服务之间通过轻量级通信机制互相协作。微服务架构可以提高应用的可伸缩性和可维护性。 下面是一个基于Vue3和Axios的微服务请求封装示例: 1. 安装Axios ``` npm install axios ``` 2. 创建axios实例 ```js import axios from 'axios' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 微服务请求的基础路径 timeout: 5000 // 超时时间 }) // 请求拦截器 service.interceptors.request.use( config => { // 在请求发送之前做些什么 return config }, error => { // 对请求错误做些什么 console.log(error) // for debug return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response => { // 对响应数据做些什么 const res = response.data if (res.code !== 20000) { // 如果响应状态码不是20000,则视为错误 return Promise.reject(new Error(res.message || 'Error')) } else { return res } }, error => { // 对响应错误做些什么 console.log('err' + error) // for debug return Promise.reject(error) } ) export default service ``` 3. 封装请求方法 ```js import request from '@/utils/request' export function getUserInfo() { return request({ url: '/user/info', method: 'get' }) } export function login(data) { return request({ url: '/user/login', method: 'post', data }) } export function logout() { return request({ url: '/user/logout', method: 'post' }) } ``` 在组件使用: ```js import { getUserInfo } from '@/api/user' export default { name: 'HelloWorld', created() { getUserInfo().then(response => { console.log(response) }) } } ``` 这样就完成了基于Vue3和Axios的微服务请求封装

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值