首页 > 其他分享 >vue封装axios的方式(三)

vue封装axios的方式(三)

时间:2023-06-17 17:11:05浏览次数:32  
标签:axios 封装 url res vue params error const

vue封装axios的方式(三)

与第二种封装基本相同,不同之处在于api的处理格式

// 引入axios
import axios from 'axios'
// 引入qs模块,对数据进行序列化
import QS from 'qs'
// 引入message模块,toast提示
import { message } from 'ant-design-vue'
// 引入storage模块,操作token
import { session } from '@/utils/storage.js'

// 请求超时时间
axios.defaults.timeout = 10000

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
    // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
    const token = session.get('Token')
    token && (config.headers.Authorization = token)
    if(config.method.toUpperCase() === 'POST') {
      config.headers['Content-Type'] = 'application/json;charset=utf-8'
    }
    return config
  },
  error => {
    return Promise.error(error)
  })
// 响应拦截器
axios.interceptors.response.use(
  response => {
    console.log(response)
    if (response.status === 200) {
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        case 500:
          message.error('网错错误,请稍后再试!')
          break
        case 404:
          message.error('网错错误,请稍后再试!')
          break
        // 其他错误,直接抛出错误提示
        default:
          message.error(error.response.data.message)
      }
      return Promise.reject(error.response)
    }
  }
)

/**
 * get方法,对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url, params) {
  return new Promise((resolve, reject) =>{
    axios.get(url, {
      params: params
    })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
/**
* post方法,对应post请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export function post(url, params) {
  return new Promise((resolve, reject) => {
    axios.post(url, QS.stringify(params))
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
/**
 * get方法,对应get请求,直接在地址后面拼串的形式
 * @param {String} url [请求的url地址]
 * @param {String} params [请求时携带的参数]
 */
export function getDynamicynamic(url, params) {
  return new Promise((resolve, reject) =>{
    const completeUrl = `${url}/${params}`
    axios.get(completeUrl, {})
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
/**
 * post方法,导出文件
 * @param {String} url [请求的url地址]
 * @param {String} params [请求时携带的参数]
 */
export function getFileUseBlobByPost(url, params = {}) {
	return new promise((resolve, reject)=> {
		axios({
	      method: 'post',
	      url,
	      data: params,
	      responseType: 'blob'
	    })
	      .then(res => {
	        resolve(res)
	      })
	      .catch(err => {
	        reject(err.data)
	      })
		})
}

创建单独的api模块

import { get, post, getDynamicynamic, getFileUseBlobByPost } from './http'

export const testPostApi = p => post('test1/api/login', p)

export const testGetDynamicApi = p => getDynamicynamic('test3/api/getnew', p)

export const testGetApi = p => get('demo2/api/goods', p)

export const testExportApi = p => getFileUseBlobByPost('demo1/api/export', p)

页面中的使用

<script setup >
import { onMounted } from 'vue'
import { testPostApi, testGetApi, testGetDynamicApi } from '@/request/api.js'

const testPostFun = async () => {
  const res = await testPostApi({ username: 'admin', password: 'admin' })
  console.log(res)
}
const testGetFun = async () => {
  const res = await testGetApi()
  console.log(res)
}
const testGetDynamicFun = async () => {
  const res = await testGetDynamicApi('15')
  console.log(res)
}
const testexportFun = async () => {
  const res = await testExportApi()
  console.log(res)
  const fileName = decodeURIComponent(res.headers['content-disposition'].split(';')[1]).split('=')[1].split('"')[1]
  let url = window.URL.createObjectURL(new Blob([res.data]))
  let a = document.createElement('a')
  a.style.display = 'none'
  a.href = url
  a.setAttribute('download', fileName)
  document.body.appendChild(a)
  a.click() //执行下载
  window.URL.revokeObjectURL(a.href) //释放url
  document.body.removeChild(a) //释放标签
}
onMounted(() => {
  testPostFun()
  testGetFun()
  testGetDynamicFun()
  testexportFun()
})
</script>

vue.config.js的参考配置

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: {
    proxy: {
      '/test1': {
        target: 'http://www.liulongbin.top:3007/',
        pathRewrite: { '^/test1': '' },
        ws: false,
        changeOrigin: true
      },
      '/demo2': {
        target: 'https://www.escook.cn/',
        pathRewrite: { '^/demo2': '' },
        ws: false,
        changeOrigin: true
      },
      '/test3': {
        target: 'http://www.liulongbin.top:3005/',
        pathRewrite: { '^/test3': '' },
        ws: false,
        changeOrigin: true
      }
    }
  }
})

标签:axios,封装,url,res,vue,params,error,const
From: https://www.cnblogs.com/Cxymds/p/17487740.html

相关文章

  • vue-json-viewer 展示json数据
    vue-json-viewer展示json数据当项目需要再网页中展示原始的json数据的时候,我们期望能够对json进行格式化展示,并且能够进行展开和折叠。vue-json-viewer可以帮助我们实现这样的功能。1.安装$npminstallvue-json-viewer@2--save//Vue2$npminstallvue-json-viewer@3-......
  • 解决vue2中methods写的方法无法使用箭头函数
    1.情况:在method写递归函数,函数内使用了this.变量,报错变量为undefined,原因是function内this指向改变,因改写为箭头函数,使其this不被改变,但是methods内又无法写箭头函数 2.解决:使用var获取this,供函数内使用 ......
  • 使用Docker将Vite Vue项目部署到Nginx二级目录
    Vue项目配置使用Vite创建一个Vue项目,点我查看如何创建配置打包路径在Nginx中如果是二级目录,例如/web时,需要设置线上的打包路径在项目跟路径下创建两个文件:.env.production、.env.development,写入一下内容:##生产环境NODE_ENV='production'VITE_BASE_PATH=/form-design......
  • vue3Props
    一、Props声明一个组件需要显式声明它所接受的props,这样Vue才能知道外部传入的哪些是props,哪些是透传 attribute在使用SFC时,props可以使用defineProps()宏来声明:如子组件中(1)constprops=defineProps(['foo'])(2)constprops=defineProps({ title:String, age......
  • VUE
    vue//注册全局组件//importTitleHeaderfrom'@/vcomponent/TitleHeader'//Vue.component(TitleHeader)//Vue.component("TitleHeader",TitleHeader)auto-complete="new-password"--密码不自动添加:close-on-click-modal="false"--el-dialog......
  • 前端Vue仿滴滴打车百度地图定位查找附近出租车或门店信息(更新版)
    前端vue仿滴滴打车百度地图定位查找附近出租车或门店信息, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12982效果图如下:使用方法<!--官方文档:https://dafrok.github.io/vue-baidu-map/#/zh/start/base-->#安装vue-baidu-map插......
  • TienChin 开篇-运行 RuoYiVue
    开篇目的:让大家随心所欲的DIY若依的脚手架不会涉及到太多基础知识踊跃提问(不懂得地方大家提问我会根据提问,后续一一解答疑惑)下载RuoYiVueGitee:https://gitee.com/y_project/RuoYi-Vue下载完毕之后,这个项目当中存在一个ruoyi-ui这个是前端,只是放在了这个项目当中方便我们进......
  • 面向对象-封装
    面向对象的封装是一种面向对象编程的核心概念,它指的是将数据和对数据的操作封装在一个类中,通过类的访问权限控制,隐藏内部实现细节,提供公共接口供其他对象访问。封装的目的是实现数据的安全性和灵活性。通过将数据和操作数据的方法封装在一起,可以隐藏实现细节,防止外部直接访问和修......
  • Vue.js 组件通信
    学习目录:Vue.js简介Vue.js实例与数据绑定Vue.js计算属性和侦听器Vue.js条件渲染和列表渲染Vue.js事件处理Vue.js表单输入绑定Vue.js组件基础Vue.js组件通信Vue.js插槽Vue.js动态组件和异步组件Vue.js自定义指令Vue.js过渡和动画Vue.js混入Vue.js自定义事件和v-model......
  • Vue全局过滤器的使用以及在template三元运算符中内使用过滤
    新建filters.js如下,内容过滤可以自己写函数,记得export导出importdayjsfrom"dayjs";//转小写letlower=value=>value.toLowerCase();//转大写letupper=value=>value.toUpperCase();letcurrencyStyle=(value,style)=>{//货币格式/***sty......